@blkc-code/cli 0.3.0 → 0.4.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.
Files changed (2) hide show
  1. package/dist/blkc.cjs +637 -213
  2. package/package.json +3 -2
package/dist/blkc.cjs CHANGED
@@ -2932,7 +2932,7 @@ Expecting one of '${allowedValues.join("', '")}'`);
2932
2932
  * @param {(string | Function)} text - string to add, or a function returning a string
2933
2933
  * @return {Command} `this` command for chaining
2934
2934
  */
2935
- addHelpText(position, text2) {
2935
+ addHelpText(position, text3) {
2936
2936
  const allowedValues = ["beforeAll", "before", "after", "afterAll"];
2937
2937
  if (!allowedValues.includes(position)) {
2938
2938
  throw new Error(`Unexpected value for position to addHelpText.
@@ -2941,10 +2941,10 @@ Expecting one of '${allowedValues.join("', '")}'`);
2941
2941
  const helpEvent = `${position}Help`;
2942
2942
  this.on(helpEvent, (context) => {
2943
2943
  let helpStr;
2944
- if (typeof text2 === "function") {
2945
- helpStr = text2({ error: context.error, command: context.command });
2944
+ if (typeof text3 === "function") {
2945
+ helpStr = text3({ error: context.error, command: context.command });
2946
2946
  } else {
2947
- helpStr = text2;
2947
+ helpStr = text3;
2948
2948
  }
2949
2949
  if (helpStr) {
2950
2950
  context.write(`${helpStr}
@@ -7049,7 +7049,7 @@ var require_react_production = __commonJS({
7049
7049
  }
7050
7050
  throw thenable;
7051
7051
  }
7052
- function mapIntoArray(children, array2, escapedPrefix, nameSoFar, callback) {
7052
+ function mapIntoArray(children, array3, escapedPrefix, nameSoFar, callback) {
7053
7053
  var type = typeof children;
7054
7054
  if ("undefined" === type || "boolean" === type) children = null;
7055
7055
  var invokeCallback = false;
@@ -7070,7 +7070,7 @@ var require_react_production = __commonJS({
7070
7070
  case REACT_LAZY_TYPE:
7071
7071
  return invokeCallback = children._init, mapIntoArray(
7072
7072
  invokeCallback(children._payload),
7073
- array2,
7073
+ array3,
7074
7074
  escapedPrefix,
7075
7075
  nameSoFar,
7076
7076
  callback
@@ -7078,7 +7078,7 @@ var require_react_production = __commonJS({
7078
7078
  }
7079
7079
  }
7080
7080
  if (invokeCallback)
7081
- return callback = callback(children), invokeCallback = "" === nameSoFar ? "." + getElementKey(children, 0) : nameSoFar, isArrayImpl(callback) ? (escapedPrefix = "", null != invokeCallback && (escapedPrefix = invokeCallback.replace(userProvidedKeyEscapeRegex, "$&/") + "/"), mapIntoArray(callback, array2, escapedPrefix, "", function(c2) {
7081
+ return callback = callback(children), invokeCallback = "" === nameSoFar ? "." + getElementKey(children, 0) : nameSoFar, isArrayImpl(callback) ? (escapedPrefix = "", null != invokeCallback && (escapedPrefix = invokeCallback.replace(userProvidedKeyEscapeRegex, "$&/") + "/"), mapIntoArray(callback, array3, escapedPrefix, "", function(c2) {
7082
7082
  return c2;
7083
7083
  })) : null != callback && (isValidElement(callback) && (callback = cloneAndReplaceKey(
7084
7084
  callback,
@@ -7086,14 +7086,14 @@ var require_react_production = __commonJS({
7086
7086
  userProvidedKeyEscapeRegex,
7087
7087
  "$&/"
7088
7088
  ) + "/") + invokeCallback
7089
- )), array2.push(callback)), 1;
7089
+ )), array3.push(callback)), 1;
7090
7090
  invokeCallback = 0;
7091
7091
  var nextNamePrefix = "" === nameSoFar ? "." : nameSoFar + ":";
7092
7092
  if (isArrayImpl(children))
7093
7093
  for (var i = 0; i < children.length; i++)
7094
7094
  nameSoFar = children[i], type = nextNamePrefix + getElementKey(nameSoFar, i), invokeCallback += mapIntoArray(
7095
7095
  nameSoFar,
7096
- array2,
7096
+ array3,
7097
7097
  escapedPrefix,
7098
7098
  type,
7099
7099
  callback
@@ -7102,7 +7102,7 @@ var require_react_production = __commonJS({
7102
7102
  for (children = i.call(children), i = 0; !(nameSoFar = children.next()).done; )
7103
7103
  nameSoFar = nameSoFar.value, type = nextNamePrefix + getElementKey(nameSoFar, i++), invokeCallback += mapIntoArray(
7104
7104
  nameSoFar,
7105
- array2,
7105
+ array3,
7106
7106
  escapedPrefix,
7107
7107
  type,
7108
7108
  callback
@@ -7111,14 +7111,14 @@ var require_react_production = __commonJS({
7111
7111
  if ("function" === typeof children.then)
7112
7112
  return mapIntoArray(
7113
7113
  resolveThenable(children),
7114
- array2,
7114
+ array3,
7115
7115
  escapedPrefix,
7116
7116
  nameSoFar,
7117
7117
  callback
7118
7118
  );
7119
- array2 = String(children);
7119
+ array3 = String(children);
7120
7120
  throw Error(
7121
- "Objects are not valid as a React child (found: " + ("[object Object]" === array2 ? "object with keys {" + Object.keys(children).join(", ") + "}" : array2) + "). If you meant to render a collection of children, use an array instead."
7121
+ "Objects are not valid as a React child (found: " + ("[object Object]" === array3 ? "object with keys {" + Object.keys(children).join(", ") + "}" : array3) + "). If you meant to render a collection of children, use an array instead."
7122
7122
  );
7123
7123
  }
7124
7124
  return invokeCallback;
@@ -7742,15 +7742,15 @@ var require_react_dom_server_legacy_node_production = __commonJS({
7742
7742
  ["xHeight", "x-height"]
7743
7743
  ]);
7744
7744
  var matchHtmlRegExp = /["'&<>]/;
7745
- function escapeTextForBrowser(text2) {
7746
- if ("boolean" === typeof text2 || "number" === typeof text2 || "bigint" === typeof text2)
7747
- return "" + text2;
7748
- text2 = "" + text2;
7749
- var match = matchHtmlRegExp.exec(text2);
7745
+ function escapeTextForBrowser(text3) {
7746
+ if ("boolean" === typeof text3 || "number" === typeof text3 || "bigint" === typeof text3)
7747
+ return "" + text3;
7748
+ text3 = "" + text3;
7749
+ var match = matchHtmlRegExp.exec(text3);
7750
7750
  if (match) {
7751
7751
  var html = "", index, lastIndex = 0;
7752
- for (index = match.index; index < text2.length; index++) {
7753
- switch (text2.charCodeAt(index)) {
7752
+ for (index = match.index; index < text3.length; index++) {
7753
+ switch (text3.charCodeAt(index)) {
7754
7754
  case 34:
7755
7755
  match = "&quot;";
7756
7756
  break;
@@ -7769,13 +7769,13 @@ var require_react_dom_server_legacy_node_production = __commonJS({
7769
7769
  default:
7770
7770
  continue;
7771
7771
  }
7772
- lastIndex !== index && (html += text2.slice(lastIndex, index));
7772
+ lastIndex !== index && (html += text3.slice(lastIndex, index));
7773
7773
  lastIndex = index + 1;
7774
7774
  html += match;
7775
7775
  }
7776
- text2 = lastIndex !== index ? html + text2.slice(lastIndex, index) : html;
7776
+ text3 = lastIndex !== index ? html + text3.slice(lastIndex, index) : html;
7777
7777
  }
7778
- return text2;
7778
+ return text3;
7779
7779
  }
7780
7780
  var uppercasePattern = /([A-Z])/g;
7781
7781
  var msPattern = /^ms-/;
@@ -9796,10 +9796,10 @@ var require_react_dom_server_legacy_node_production = __commonJS({
9796
9796
  generateStaticMarkup
9797
9797
  };
9798
9798
  }
9799
- function pushTextInstance(target, text2, renderState, textEmbedded) {
9799
+ function pushTextInstance(target, text3, renderState, textEmbedded) {
9800
9800
  if (renderState.generateStaticMarkup)
9801
- return target.push(escapeTextForBrowser(text2)), false;
9802
- "" === text2 ? target = textEmbedded : (textEmbedded && target.push("<!-- -->"), target.push(escapeTextForBrowser(text2)), target = true);
9801
+ return target.push(escapeTextForBrowser(text3)), false;
9802
+ "" === text3 ? target = textEmbedded : (textEmbedded && target.push("<!-- -->"), target.push(escapeTextForBrowser(text3)), target = true);
9803
9803
  return target;
9804
9804
  }
9805
9805
  function pushSegmentFinale(target, renderState, lastPushedText, textEmbedded) {
@@ -13032,15 +13032,15 @@ var require_react_dom_server_node_production = __commonJS({
13032
13032
  ["xHeight", "x-height"]
13033
13033
  ]);
13034
13034
  var matchHtmlRegExp = /["'&<>]/;
13035
- function escapeTextForBrowser(text2) {
13036
- if ("boolean" === typeof text2 || "number" === typeof text2 || "bigint" === typeof text2)
13037
- return "" + text2;
13038
- text2 = "" + text2;
13039
- var match = matchHtmlRegExp.exec(text2);
13035
+ function escapeTextForBrowser(text3) {
13036
+ if ("boolean" === typeof text3 || "number" === typeof text3 || "bigint" === typeof text3)
13037
+ return "" + text3;
13038
+ text3 = "" + text3;
13039
+ var match = matchHtmlRegExp.exec(text3);
13040
13040
  if (match) {
13041
13041
  var html = "", index, lastIndex = 0;
13042
- for (index = match.index; index < text2.length; index++) {
13043
- switch (text2.charCodeAt(index)) {
13042
+ for (index = match.index; index < text3.length; index++) {
13043
+ switch (text3.charCodeAt(index)) {
13044
13044
  case 34:
13045
13045
  match = "&quot;";
13046
13046
  break;
@@ -13059,13 +13059,13 @@ var require_react_dom_server_node_production = __commonJS({
13059
13059
  default:
13060
13060
  continue;
13061
13061
  }
13062
- lastIndex !== index && (html += text2.slice(lastIndex, index));
13062
+ lastIndex !== index && (html += text3.slice(lastIndex, index));
13063
13063
  lastIndex = index + 1;
13064
13064
  html += match;
13065
13065
  }
13066
- text2 = lastIndex !== index ? html + text2.slice(lastIndex, index) : html;
13066
+ text3 = lastIndex !== index ? html + text3.slice(lastIndex, index) : html;
13067
13067
  }
13068
- return text2;
13068
+ return text3;
13069
13069
  }
13070
13070
  var uppercasePattern = /([A-Z])/g;
13071
13071
  var msPattern = /^ms-/;
@@ -13351,10 +13351,10 @@ var require_react_dom_server_node_production = __commonJS({
13351
13351
  return resumableState + "_";
13352
13352
  }
13353
13353
  var textSeparator = stringToPrecomputedChunk("<!-- -->");
13354
- function pushTextInstance(target, text2, renderState, textEmbedded) {
13355
- if ("" === text2) return textEmbedded;
13354
+ function pushTextInstance(target, text3, renderState, textEmbedded) {
13355
+ if ("" === text3) return textEmbedded;
13356
13356
  textEmbedded && target.push(textSeparator);
13357
- target.push(escapeTextForBrowser(text2));
13357
+ target.push(escapeTextForBrowser(text3));
13358
13358
  return true;
13359
13359
  }
13360
13360
  function pushViewTransitionAttributes(target, formatContext) {
@@ -31167,13 +31167,13 @@ var require_JSXTransformer = __commonJS({
31167
31167
  return firstChar >= _charcodes.charCodes.lowercaseA && firstChar <= _charcodes.charCodes.lowercaseZ;
31168
31168
  }
31169
31169
  exports2.startsWithLowerCase = startsWithLowerCase;
31170
- function formatJSXTextLiteral(text2) {
31170
+ function formatJSXTextLiteral(text3) {
31171
31171
  let result = "";
31172
31172
  let whitespace = "";
31173
31173
  let isInInitialLineWhitespace = false;
31174
31174
  let seenNonWhitespace = false;
31175
- for (let i = 0; i < text2.length; i++) {
31176
- const c2 = text2[i];
31175
+ for (let i = 0; i < text3.length; i++) {
31176
+ const c2 = text3[i];
31177
31177
  if (c2 === " " || c2 === " " || c2 === "\r") {
31178
31178
  if (!isInInitialLineWhitespace) {
31179
31179
  whitespace += c2;
@@ -31188,7 +31188,7 @@ var require_JSXTransformer = __commonJS({
31188
31188
  result += whitespace;
31189
31189
  whitespace = "";
31190
31190
  if (c2 === "&") {
31191
- const { entity, newI } = processEntity(text2, i + 1);
31191
+ const { entity, newI } = processEntity(text3, i + 1);
31192
31192
  i = newI - 1;
31193
31193
  result += entity;
31194
31194
  } else {
@@ -31203,10 +31203,10 @@ var require_JSXTransformer = __commonJS({
31203
31203
  }
31204
31204
  return JSON.stringify(result);
31205
31205
  }
31206
- function formatJSXTextReplacement(text2) {
31206
+ function formatJSXTextReplacement(text3) {
31207
31207
  let numNewlines = 0;
31208
31208
  let numSpaces = 0;
31209
- for (const c2 of text2) {
31209
+ for (const c2 of text3) {
31210
31210
  if (c2 === "\n") {
31211
31211
  numNewlines++;
31212
31212
  numSpaces = 0;
@@ -31216,21 +31216,21 @@ var require_JSXTransformer = __commonJS({
31216
31216
  }
31217
31217
  return "\n".repeat(numNewlines) + " ".repeat(numSpaces);
31218
31218
  }
31219
- function formatJSXStringValueLiteral(text2) {
31219
+ function formatJSXStringValueLiteral(text3) {
31220
31220
  let result = "";
31221
- for (let i = 0; i < text2.length; i++) {
31222
- const c2 = text2[i];
31221
+ for (let i = 0; i < text3.length; i++) {
31222
+ const c2 = text3[i];
31223
31223
  if (c2 === "\n") {
31224
- if (/\s/.test(text2[i + 1])) {
31224
+ if (/\s/.test(text3[i + 1])) {
31225
31225
  result += " ";
31226
- while (i < text2.length && /\s/.test(text2[i + 1])) {
31226
+ while (i < text3.length && /\s/.test(text3[i + 1])) {
31227
31227
  i++;
31228
31228
  }
31229
31229
  } else {
31230
31230
  result += "\n";
31231
31231
  }
31232
31232
  } else if (c2 === "&") {
31233
- const { entity, newI } = processEntity(text2, i + 1);
31233
+ const { entity, newI } = processEntity(text3, i + 1);
31234
31234
  result += entity;
31235
31235
  i = newI - 1;
31236
31236
  } else {
@@ -31239,38 +31239,38 @@ var require_JSXTransformer = __commonJS({
31239
31239
  }
31240
31240
  return JSON.stringify(result);
31241
31241
  }
31242
- function processEntity(text2, indexAfterAmpersand) {
31242
+ function processEntity(text3, indexAfterAmpersand) {
31243
31243
  let str = "";
31244
31244
  let count = 0;
31245
31245
  let entity;
31246
31246
  let i = indexAfterAmpersand;
31247
- if (text2[i] === "#") {
31247
+ if (text3[i] === "#") {
31248
31248
  let radix = 10;
31249
31249
  i++;
31250
31250
  let numStart;
31251
- if (text2[i] === "x") {
31251
+ if (text3[i] === "x") {
31252
31252
  radix = 16;
31253
31253
  i++;
31254
31254
  numStart = i;
31255
- while (i < text2.length && isHexDigit(text2.charCodeAt(i))) {
31255
+ while (i < text3.length && isHexDigit(text3.charCodeAt(i))) {
31256
31256
  i++;
31257
31257
  }
31258
31258
  } else {
31259
31259
  numStart = i;
31260
- while (i < text2.length && isDecimalDigit(text2.charCodeAt(i))) {
31260
+ while (i < text3.length && isDecimalDigit(text3.charCodeAt(i))) {
31261
31261
  i++;
31262
31262
  }
31263
31263
  }
31264
- if (text2[i] === ";") {
31265
- const numStr = text2.slice(numStart, i);
31264
+ if (text3[i] === ";") {
31265
+ const numStr = text3.slice(numStart, i);
31266
31266
  if (numStr) {
31267
31267
  i++;
31268
31268
  entity = String.fromCodePoint(parseInt(numStr, radix));
31269
31269
  }
31270
31270
  }
31271
31271
  } else {
31272
- while (i < text2.length && count++ < 10) {
31273
- const ch = text2[i];
31272
+ while (i < text3.length && count++ < 10) {
31273
+ const ch = text3[i];
31274
31274
  i++;
31275
31275
  if (ch === ";") {
31276
31276
  entity = _xhtml2.default.get(str);
@@ -33017,21 +33017,21 @@ var require_gen_mapping_umd = __commonJS({
33017
33017
  function put(setarr, key) {
33018
33018
  const index = get2(setarr, key);
33019
33019
  if (index !== void 0) return index;
33020
- const { array: array2, _indexes: indexes } = cast(setarr);
33021
- const length = array2.push(key);
33020
+ const { array: array3, _indexes: indexes } = cast(setarr);
33021
+ const length = array3.push(key);
33022
33022
  return indexes[key] = length - 1;
33023
33023
  }
33024
33024
  function remove(setarr, key) {
33025
33025
  const index = get2(setarr, key);
33026
33026
  if (index === void 0) return;
33027
- const { array: array2, _indexes: indexes } = cast(setarr);
33028
- for (let i = index + 1; i < array2.length; i++) {
33029
- const k2 = array2[i];
33030
- array2[i - 1] = k2;
33027
+ const { array: array3, _indexes: indexes } = cast(setarr);
33028
+ for (let i = index + 1; i < array3.length; i++) {
33029
+ const k2 = array3[i];
33030
+ array3[i - 1] = k2;
33031
33031
  indexes[k2]--;
33032
33032
  }
33033
33033
  indexes[key] = void 0;
33034
- array2.pop();
33034
+ array3.pop();
33035
33035
  }
33036
33036
  var import_sourcemap_codec = __toESM2(require_sourcemap_codec());
33037
33037
  var import_trace_mapping = __toESM2(require_trace_mapping());
@@ -33215,11 +33215,11 @@ var require_gen_mapping_umd = __commonJS({
33215
33215
  }
33216
33216
  return index;
33217
33217
  }
33218
- function insert(array2, index, value) {
33219
- for (let i = array2.length; i > index; i--) {
33220
- array2[i] = array2[i - 1];
33218
+ function insert(array3, index, value) {
33219
+ for (let i = array3.length; i > index; i--) {
33220
+ array3[i] = array3[i - 1];
33221
33221
  }
33222
- array2[index] = value;
33222
+ array3[index] = value;
33223
33223
  }
33224
33224
  function removeEmptyFinalLines(mappings) {
33225
33225
  const { length } = mappings;
@@ -33229,8 +33229,8 @@ var require_gen_mapping_umd = __commonJS({
33229
33229
  }
33230
33230
  if (len < length) mappings.length = len;
33231
33231
  }
33232
- function putAll(setarr, array2) {
33233
- for (let i = 0; i < array2.length; i++) put(setarr, array2[i]);
33232
+ function putAll(setarr, array3) {
33233
+ for (let i = 0; i < array3.length; i++) put(setarr, array3[i]);
33234
33234
  }
33235
33235
  function skipSourceless(line, index) {
33236
33236
  if (index === 0) return true;
@@ -33892,10 +33892,10 @@ var require_types2 = __commonJS({
33892
33892
  }(TType)
33893
33893
  );
33894
33894
  exports2.TLiteral = TLiteral;
33895
- function array2(typeSpec) {
33895
+ function array3(typeSpec) {
33896
33896
  return new TArray(parseSpec(typeSpec));
33897
33897
  }
33898
- exports2.array = array2;
33898
+ exports2.array = array3;
33899
33899
  var TArray = (
33900
33900
  /** @class */
33901
33901
  function(_super) {
@@ -34901,7 +34901,7 @@ var require_typescript = __commonJS({
34901
34901
  var _lval = require_lval();
34902
34902
  var _statement = require_statement();
34903
34903
  var _util = require_util();
34904
- var _jsx6 = require_jsx();
34904
+ var _jsx7 = require_jsx();
34905
34905
  function tsIsIdentifier() {
34906
34906
  return _index.match.call(void 0, _types.TokenType.name);
34907
34907
  }
@@ -35525,7 +35525,7 @@ var require_typescript = __commonJS({
35525
35525
  tsParseType();
35526
35526
  _index.eat.call(void 0, _types.TokenType.comma);
35527
35527
  }
35528
- _jsx6.nextJSXTagToken.call(void 0);
35528
+ _jsx7.nextJSXTagToken.call(void 0);
35529
35529
  _index.popTypeContext.call(void 0, oldIsType);
35530
35530
  }
35531
35531
  }
@@ -44995,9 +44995,9 @@ var Ora = class {
44995
44995
  this.#linesToClear = this.#lineCount;
44996
44996
  return this;
44997
44997
  }
44998
- start(text2) {
44999
- if (text2) {
45000
- this.text = text2;
44998
+ start(text3) {
44999
+ if (text3) {
45000
+ this.text = text3;
45001
45001
  }
45002
45002
  if (this.#isSilent) {
45003
45003
  return this;
@@ -45040,17 +45040,17 @@ var Ora = class {
45040
45040
  }
45041
45041
  return this;
45042
45042
  }
45043
- succeed(text2) {
45044
- return this.stopAndPersist({ symbol: log_symbols_default.success, text: text2 });
45043
+ succeed(text3) {
45044
+ return this.stopAndPersist({ symbol: log_symbols_default.success, text: text3 });
45045
45045
  }
45046
- fail(text2) {
45047
- return this.stopAndPersist({ symbol: log_symbols_default.error, text: text2 });
45046
+ fail(text3) {
45047
+ return this.stopAndPersist({ symbol: log_symbols_default.error, text: text3 });
45048
45048
  }
45049
- warn(text2) {
45050
- return this.stopAndPersist({ symbol: log_symbols_default.warning, text: text2 });
45049
+ warn(text3) {
45050
+ return this.stopAndPersist({ symbol: log_symbols_default.warning, text: text3 });
45051
45051
  }
45052
- info(text2) {
45053
- return this.stopAndPersist({ symbol: log_symbols_default.info, text: text2 });
45052
+ info(text3) {
45053
+ return this.stopAndPersist({ symbol: log_symbols_default.info, text: text3 });
45054
45054
  }
45055
45055
  stopAndPersist(options = {}) {
45056
45056
  if (this.#isSilent) {
@@ -45059,9 +45059,9 @@ var Ora = class {
45059
45059
  const prefixText = options.prefixText ?? this.#prefixText;
45060
45060
  const fullPrefixText = this.#getFullPrefixText(prefixText, " ");
45061
45061
  const symbolText = options.symbol ?? " ";
45062
- const text2 = options.text ?? this.text;
45062
+ const text3 = options.text ?? this.text;
45063
45063
  const separatorText = symbolText ? " " : "";
45064
- const fullText = typeof text2 === "string" ? separatorText + text2 : "";
45064
+ const fullText = typeof text3 === "string" ? separatorText + text3 : "";
45065
45065
  const suffixText = options.suffixText ?? this.#suffixText;
45066
45066
  const fullSuffixText = this.#getFullSuffixText(suffixText, " ");
45067
45067
  const textToWrite = fullPrefixText + symbolText + fullText + fullSuffixText + "\n";
@@ -45762,8 +45762,8 @@ function getEnumValues(entries) {
45762
45762
  const values = Object.entries(entries).filter(([k2, _2]) => numericValues.indexOf(+k2) === -1).map(([_2, v]) => v);
45763
45763
  return values;
45764
45764
  }
45765
- function joinValues(array2, separator = "|") {
45766
- return array2.map((val) => stringifyPrimitive(val)).join(separator);
45765
+ function joinValues(array3, separator = "|") {
45766
+ return array3.map((val) => stringifyPrimitive(val)).join(separator);
45767
45767
  }
45768
45768
  function jsonStringifyReplacer(_2, value) {
45769
45769
  if (typeof value === "bigint")
@@ -54431,8 +54431,8 @@ function ko_default() {
54431
54431
  }
54432
54432
 
54433
54433
  // ../../node_modules/zod/v4/locales/lt.js
54434
- var capitalizeFirstCharacter = (text2) => {
54435
- return text2.charAt(0).toUpperCase() + text2.slice(1);
54434
+ var capitalizeFirstCharacter = (text3) => {
54435
+ return text3.charAt(0).toUpperCase() + text3.slice(1);
54436
54436
  };
54437
54437
  function getUnitTypeFromNumber(number4) {
54438
54438
  const abs = Math.abs(number4);
@@ -65510,7 +65510,7 @@ function hasBom(buffer) {
65510
65510
  return buffer.length >= 3 && buffer[0] === 239 && buffer[1] === 187 && buffer[2] === 191;
65511
65511
  }
65512
65512
  function parseManifest(buffer) {
65513
- const text2 = buffer.toString("utf8");
65513
+ const text3 = buffer.toString("utf8");
65514
65514
  if (hasBom(buffer)) {
65515
65515
  return {
65516
65516
  ok: false,
@@ -65521,7 +65521,7 @@ function parseManifest(buffer) {
65521
65521
  };
65522
65522
  }
65523
65523
  try {
65524
- return { ok: true, value: JSON.parse(text2) };
65524
+ return { ok: true, value: JSON.parse(text3) };
65525
65525
  } catch (error62) {
65526
65526
  return { ok: false, errors: [error62 instanceof Error ? error62.message : String(error62)] };
65527
65527
  }
@@ -66527,6 +66527,7 @@ var import_node_fs = require("node:fs");
66527
66527
  var import_promises8 = require("node:fs/promises");
66528
66528
  var import_node_path8 = __toESM(require("node:path"), 1);
66529
66529
  var MANIFEST_NAMES = ["block.json", "kit.json", "circuit.json", "manifest.json"];
66530
+ var SKIPPED_FOLDERS = /* @__PURE__ */ new Set(["node_modules", "dist", "coverage"]);
66530
66531
  async function isDir(p2) {
66531
66532
  try {
66532
66533
  return (await (0, import_promises8.stat)(p2)).isDirectory();
@@ -66542,15 +66543,23 @@ function isCompanion(file2) {
66542
66543
  if (import_node_path8.default.basename(dir) === "boards") return (0, import_node_fs.existsSync)(import_node_path8.default.join(dir, "..", "circuit.json"));
66543
66544
  return false;
66544
66545
  }
66546
+ async function isJsonSchema(file2) {
66547
+ try {
66548
+ const parsed = JSON.parse(await (0, import_promises8.readFile)(file2, "utf8"));
66549
+ return typeof parsed.$schema === "string" && /^https?:\/\/json-schema\.org\//.test(parsed.$schema);
66550
+ } catch {
66551
+ return false;
66552
+ }
66553
+ }
66545
66554
  async function walkManifests(root) {
66546
66555
  const found = [];
66547
66556
  const entries = await (0, import_promises8.readdir)(root, { withFileTypes: true });
66548
66557
  for (const entry of entries) {
66549
- if (entry.name === "node_modules" || entry.name.startsWith(".")) continue;
66558
+ if (SKIPPED_FOLDERS.has(entry.name) || entry.name.startsWith(".")) continue;
66550
66559
  const full = import_node_path8.default.join(root, entry.name);
66551
66560
  if (entry.isDirectory()) {
66552
66561
  found.push(...await walkManifests(full));
66553
- } else if (entry.isFile() && (MANIFEST_NAMES.includes(entry.name) || isCompanion(full))) {
66562
+ } else if (entry.isFile() && (MANIFEST_NAMES.includes(entry.name) || isCompanion(full)) && !await isJsonSchema(full)) {
66554
66563
  found.push(full);
66555
66564
  }
66556
66565
  }
@@ -66715,9 +66724,9 @@ var pixelOfficeKit = {
66715
66724
  "manifestVersion": 2,
66716
66725
  "id": "pixel-office",
66717
66726
  "name": "Pixel Office",
66718
- "summary": "A free Kit: the landing page for a pixel-art office for your project.",
66719
- "description": "The first release of Pixel Office: a themed landing page you can render with @blkc-code/render-web. The pixel-art office itself is not built yet. It needs the reserved canvas renderer.",
66720
- "version": "0.1.0",
66727
+ "summary": "A free Kit: a living pixel-art office for your project, plus a landing page.",
66728
+ "description": "Your agents and tasks become characters and quests in a pixel-art office, drawn by @blkc-code/render-canvas. The rest of the Kit shows every web Block with one theme.",
66729
+ "version": "0.2.0",
66721
66730
  "category": "showcase",
66722
66731
  "tags": [
66723
66732
  "pixel",
@@ -66730,12 +66739,57 @@ var pixelOfficeKit = {
66730
66739
  "blocks": [
66731
66740
  {
66732
66741
  "blockId": "hero",
66733
- "version": "^0.2.0",
66742
+ "version": "^0.4.0",
66743
+ "required": true
66744
+ },
66745
+ {
66746
+ "blockId": "office",
66747
+ "version": "^0.4.0",
66748
+ "required": true
66749
+ },
66750
+ {
66751
+ "blockId": "services",
66752
+ "version": "^0.4.0",
66753
+ "required": true
66754
+ },
66755
+ {
66756
+ "blockId": "values",
66757
+ "version": "^0.4.0",
66758
+ "required": true
66759
+ },
66760
+ {
66761
+ "blockId": "cta",
66762
+ "version": "^0.4.0",
66734
66763
  "required": true
66735
66764
  },
66736
66765
  {
66737
66766
  "blockId": "text",
66738
- "version": "^0.2.0",
66767
+ "version": "^0.4.0",
66768
+ "required": true
66769
+ },
66770
+ {
66771
+ "blockId": "image",
66772
+ "version": "^0.4.0",
66773
+ "required": true
66774
+ },
66775
+ {
66776
+ "blockId": "button",
66777
+ "version": "^0.4.0",
66778
+ "required": true
66779
+ },
66780
+ {
66781
+ "blockId": "section",
66782
+ "version": "^0.4.0",
66783
+ "required": true
66784
+ },
66785
+ {
66786
+ "blockId": "story",
66787
+ "version": "^0.4.0",
66788
+ "required": true
66789
+ },
66790
+ {
66791
+ "blockId": "contact",
66792
+ "version": "^0.4.0",
66739
66793
  "required": true
66740
66794
  }
66741
66795
  ],
@@ -66747,12 +66801,12 @@ var pixelOfficeKit = {
66747
66801
  {
66748
66802
  "slug": "background",
66749
66803
  "name": "Background",
66750
- "color": "#1a1a2e"
66804
+ "color": "#14142b"
66751
66805
  },
66752
66806
  {
66753
66807
  "slug": "foreground",
66754
66808
  "name": "Foreground",
66755
- "color": "#e0e0e0"
66809
+ "color": "#f1f1f8"
66756
66810
  },
66757
66811
  {
66758
66812
  "slug": "primary",
@@ -66762,26 +66816,36 @@ var pixelOfficeKit = {
66762
66816
  {
66763
66817
  "slug": "accent",
66764
66818
  "name": "Accent",
66765
- "color": "#ff6b6b"
66819
+ "color": "#ff7ab6"
66766
66820
  },
66767
66821
  {
66768
66822
  "slug": "muted-foreground",
66769
66823
  "name": "Muted text",
66770
- "color": "#a0a0b8"
66824
+ "color": "#b6b6d2"
66771
66825
  },
66772
66826
  {
66773
66827
  "slug": "surface",
66774
66828
  "name": "Surface",
66775
- "color": "#16213e"
66829
+ "color": "#20203f"
66830
+ },
66831
+ {
66832
+ "slug": "border",
66833
+ "name": "Border",
66834
+ "color": "#38386a"
66776
66835
  }
66777
66836
  ]
66778
66837
  },
66779
66838
  "typography": {
66780
66839
  "fontFamilies": [
66840
+ {
66841
+ "slug": "body",
66842
+ "name": "Body",
66843
+ "fontFamily": "ui-monospace, Menlo, Consolas, monospace"
66844
+ },
66781
66845
  {
66782
66846
  "slug": "pixel",
66783
66847
  "name": "Pixel",
66784
- "fontFamily": "'Press Start 2P', monospace"
66848
+ "fontFamily": "'Press Start 2P', ui-monospace, monospace"
66785
66849
  }
66786
66850
  ]
66787
66851
  }
@@ -66791,33 +66855,300 @@ var pixelOfficeKit = {
66791
66855
  "pages": [
66792
66856
  {
66793
66857
  "slug": "",
66794
- "title": "Pixel Office",
66858
+ "title": "Home",
66795
66859
  "blocks": [
66796
66860
  {
66797
66861
  "block": "hero",
66798
66862
  "props": {
66799
66863
  "eyebrow": "Free and MIT licensed",
66800
66864
  "heading": "Pixel Office",
66801
- "subheading": "A pixel-art office for your project, on its way. This Kit is the first piece: its theme and landing page.",
66865
+ "subheading": "Your agents and tasks, alive in a pixel-art office. Click someone to see what they are doing.",
66802
66866
  "cta": {
66803
- "label": "View on GitHub",
66867
+ "label": "Get the Kit",
66804
66868
  "href": "https://github.com/blkc-community/kits/tree/main/pixel-office"
66805
66869
  },
66806
66870
  "secondaryCta": {
66807
66871
  "label": "Read the docs",
66808
- "href": "https://blkc.blackcode.space/docs"
66872
+ "href": "https://blkc.blackcode.space/docs/quickstart",
66873
+ "variant": "outline"
66809
66874
  },
66810
- "tone": "inverse",
66811
- "size": "lg",
66875
+ "size": "md",
66812
66876
  "align": "center"
66813
66877
  }
66814
66878
  },
66879
+ {
66880
+ "block": "office",
66881
+ "props": {
66882
+ "heading": "Meet the team",
66883
+ "intro": "Everyone here is data. Change a status in JSON and they get up and walk to where that work happens.",
66884
+ "agents": [
66885
+ {
66886
+ "id": "nova",
66887
+ "name": "Nova",
66888
+ "role": "Builder",
66889
+ "state": "working",
66890
+ "task": "Building the checkout page"
66891
+ },
66892
+ {
66893
+ "id": "sage",
66894
+ "name": "Sage",
66895
+ "role": "Researcher",
66896
+ "state": "thinking",
66897
+ "task": "Comparing three ways to do search"
66898
+ },
66899
+ {
66900
+ "id": "rex",
66901
+ "name": "Rex",
66902
+ "role": "Fixer",
66903
+ "state": "blocked",
66904
+ "task": "Waiting on a login to the staging site"
66905
+ },
66906
+ {
66907
+ "id": "juno",
66908
+ "name": "Juno",
66909
+ "role": "Reviewer",
66910
+ "state": "reviewing",
66911
+ "task": "Reading through the pricing page"
66912
+ },
66913
+ {
66914
+ "id": "mika",
66915
+ "name": "Mika",
66916
+ "role": "Writer",
66917
+ "state": "idle",
66918
+ "task": "Taking a break between articles"
66919
+ },
66920
+ {
66921
+ "id": "ola",
66922
+ "name": "Ola",
66923
+ "role": "Designer",
66924
+ "state": "done",
66925
+ "task": "Finished the new logo"
66926
+ }
66927
+ ],
66928
+ "tasks": [
66929
+ {
66930
+ "title": "Design the logo",
66931
+ "state": "done",
66932
+ "agent": "ola"
66933
+ },
66934
+ {
66935
+ "title": "Write the about page",
66936
+ "state": "done",
66937
+ "agent": "mika"
66938
+ },
66939
+ {
66940
+ "title": "Build the checkout page",
66941
+ "state": "doing",
66942
+ "agent": "nova"
66943
+ },
66944
+ {
66945
+ "title": "Choose a search tool",
66946
+ "state": "doing",
66947
+ "agent": "sage"
66948
+ },
66949
+ {
66950
+ "title": "Review the pricing page",
66951
+ "state": "doing",
66952
+ "agent": "juno"
66953
+ },
66954
+ {
66955
+ "title": "Fix the staging login",
66956
+ "state": "todo",
66957
+ "agent": "rex"
66958
+ },
66959
+ {
66960
+ "title": "Launch",
66961
+ "state": "todo"
66962
+ }
66963
+ ]
66964
+ }
66965
+ },
66966
+ {
66967
+ "block": "services",
66968
+ "props": {
66969
+ "heading": "What is in the Kit",
66970
+ "intro": "A Kit is a theme, pages and Blocks you can edit. Nothing here is locked away.",
66971
+ "items": [
66972
+ {
66973
+ "title": "A living office",
66974
+ "text": "People walk, work, take breaks and raise a flag when they are stuck, all from their status."
66975
+ },
66976
+ {
66977
+ "title": "Quests",
66978
+ "text": "Tasks show as notes on the quest board and as a progress bar across the office."
66979
+ },
66980
+ {
66981
+ "title": "Your layout",
66982
+ "text": "Rooms, doors and furniture are JSON, so you can build the office you want."
66983
+ }
66984
+ ]
66985
+ }
66986
+ },
66987
+ {
66988
+ "block": "values",
66989
+ "props": {
66990
+ "heading": "Why build it this way",
66991
+ "items": [
66992
+ {
66993
+ "title": "You own it",
66994
+ "text": "It is a folder of files in your project. Fork it and change anything."
66995
+ },
66996
+ {
66997
+ "title": "No lock-in",
66998
+ "text": "Plain JSON, and a page that still reads well with no JavaScript."
66999
+ },
67000
+ {
67001
+ "title": "Original art",
67002
+ "text": "Every sprite is drawn in code, so you can restyle it freely."
67003
+ }
67004
+ ]
67005
+ }
67006
+ },
67007
+ {
67008
+ "block": "cta",
67009
+ "props": {
67010
+ "heading": "Make it your own",
67011
+ "text": "Fork the Kit and run it on your machine in under a minute.",
67012
+ "cta": {
67013
+ "label": "See how",
67014
+ "href": "https://blkc.blackcode.space/docs/quickstart"
67015
+ }
67016
+ }
67017
+ }
67018
+ ]
67019
+ },
67020
+ {
67021
+ "slug": "blocks",
67022
+ "title": "Every Block",
67023
+ "blocks": [
67024
+ {
67025
+ "block": "hero",
67026
+ "props": {
67027
+ "eyebrow": "The hero Block",
67028
+ "heading": "Every Block, one theme",
67029
+ "subheading": "This page uses each web Block once, so you can see them together and take what you need.",
67030
+ "cta": {
67031
+ "label": "Primary button",
67032
+ "href": "#"
67033
+ },
67034
+ "secondaryCta": {
67035
+ "label": "Second button",
67036
+ "href": "#",
67037
+ "variant": "outline"
67038
+ },
67039
+ "align": "center",
67040
+ "size": "sm"
67041
+ }
67042
+ },
66815
67043
  {
66816
67044
  "block": "text",
66817
67045
  "props": {
66818
- "content": '<p>Pixel Office will turn a BLKC project into a playful pixel-art office, with your AI coding agents as animated characters. It is inspired by <a href="https://github.com/pixel-agents-hq/pixel-agents">Pixel Agents</a> (MIT).</p><p>Today this Kit is a landing page and a theme. The office needs a canvas renderer, which BLKC has reserved in its format but not built yet.</p>',
66819
- "tag": "div",
66820
- "textAlign": "center"
67046
+ "content": '<p>This is the <strong>text</strong> Block. It keeps lines to a comfortable length and takes rich text, including <a href="https://github.com/blkc-community/blocks">links</a>.</p><p>Everything on this page takes its colours and fonts from the Kit, so changing the theme changes all of it.</p>',
67047
+ "tag": "div"
67048
+ }
67049
+ },
67050
+ {
67051
+ "block": "image",
67052
+ "props": {
67053
+ "src": "data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2032%2018%22%20shape-rendering%3D%22crispEdges%22%3E%3Crect%20width%3D%2232%22%20height%3D%2218%22%20fill%3D%22%231f1f3d%22%2F%3E%3Crect%20y%3D%2213%22%20width%3D%2232%22%20height%3D%225%22%20fill%3D%22%23a06f45%22%2F%3E%3Crect%20x%3D%224%22%20y%3D%229%22%20width%3D%2210%22%20height%3D%224%22%20fill%3D%22%238a5a33%22%2F%3E%3Crect%20x%3D%227%22%20y%3D%225%22%20width%3D%225%22%20height%3D%224%22%20fill%3D%22%23111827%22%2F%3E%3Crect%20x%3D%228%22%20y%3D%226%22%20width%3D%223%22%20height%3D%222%22%20fill%3D%22%2300ff88%22%2F%3E%3Crect%20x%3D%2219%22%20y%3D%226%22%20width%3D%224%22%20height%3D%224%22%20fill%3D%22%23f4d3b5%22%2F%3E%3Crect%20x%3D%2219%22%20y%3D%224%22%20width%3D%224%22%20height%3D%222%22%20fill%3D%22%235a3a22%22%2F%3E%3Crect%20x%3D%2218%22%20y%3D%2210%22%20width%3D%226%22%20height%3D%225%22%20fill%3D%22%233b82f6%22%2F%3E%3Crect%20x%3D%2226%22%20y%3D%229%22%20width%3D%223%22%20height%3D%224%22%20fill%3D%22%2315803d%22%2F%3E%3Crect%20x%3D%2226%22%20y%3D%2213%22%20width%3D%223%22%20height%3D%222%22%20fill%3D%22%2392400e%22%2F%3E%3C%2Fsvg%3E",
67054
+ "alt": "A pixel-art person at a desk with a computer and a plant",
67055
+ "caption": "The image Block, with a caption.",
67056
+ "width": "480px"
67057
+ }
67058
+ },
67059
+ {
67060
+ "block": "button",
67061
+ "props": {
67062
+ "label": "The button Block",
67063
+ "href": "#",
67064
+ "variant": "primary",
67065
+ "size": "lg"
67066
+ }
67067
+ },
67068
+ {
67069
+ "block": "section",
67070
+ "props": {
67071
+ "backgroundColor": "#20203f",
67072
+ "heading": "The section Block",
67073
+ "content": "<p>A band of colour that holds its own words, or other Blocks in code.</p>"
67074
+ }
67075
+ },
67076
+ {
67077
+ "block": "services",
67078
+ "props": {
67079
+ "heading": "The services Block",
67080
+ "intro": "A heading, an intro and a grid of cards.",
67081
+ "items": [
67082
+ {
67083
+ "title": "First",
67084
+ "text": "Each card has a title and some text.",
67085
+ "link": {
67086
+ "label": "And a link",
67087
+ "href": "#"
67088
+ }
67089
+ },
67090
+ {
67091
+ "title": "Second",
67092
+ "text": "The grid adapts to the width of the screen."
67093
+ },
67094
+ {
67095
+ "title": "Third",
67096
+ "text": "Hover over a card to lift it."
67097
+ }
67098
+ ]
67099
+ }
67100
+ },
67101
+ {
67102
+ "block": "story",
67103
+ "props": {
67104
+ "heading": "The story Block",
67105
+ "body": "<p>Words on one side and a picture on the other. On a phone they stack.</p><p>Use <strong>imageSide</strong> to swap them over.</p>",
67106
+ "image": {
67107
+ "src": "data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2032%2018%22%20shape-rendering%3D%22crispEdges%22%3E%3Crect%20width%3D%2232%22%20height%3D%2218%22%20fill%3D%22%231f1f3d%22%2F%3E%3Crect%20y%3D%2213%22%20width%3D%2232%22%20height%3D%225%22%20fill%3D%22%23a06f45%22%2F%3E%3Crect%20x%3D%224%22%20y%3D%229%22%20width%3D%2210%22%20height%3D%224%22%20fill%3D%22%238a5a33%22%2F%3E%3Crect%20x%3D%227%22%20y%3D%225%22%20width%3D%225%22%20height%3D%224%22%20fill%3D%22%23111827%22%2F%3E%3Crect%20x%3D%228%22%20y%3D%226%22%20width%3D%223%22%20height%3D%222%22%20fill%3D%22%2300ff88%22%2F%3E%3Crect%20x%3D%2219%22%20y%3D%226%22%20width%3D%224%22%20height%3D%224%22%20fill%3D%22%23f4d3b5%22%2F%3E%3Crect%20x%3D%2219%22%20y%3D%224%22%20width%3D%224%22%20height%3D%222%22%20fill%3D%22%235a3a22%22%2F%3E%3Crect%20x%3D%2218%22%20y%3D%2210%22%20width%3D%226%22%20height%3D%225%22%20fill%3D%22%233b82f6%22%2F%3E%3Crect%20x%3D%2226%22%20y%3D%229%22%20width%3D%223%22%20height%3D%224%22%20fill%3D%22%2315803d%22%2F%3E%3Crect%20x%3D%2226%22%20y%3D%2213%22%20width%3D%223%22%20height%3D%222%22%20fill%3D%22%2392400e%22%2F%3E%3C%2Fsvg%3E",
67108
+ "alt": "A pixel-art office scene"
67109
+ },
67110
+ "imageSide": "right"
67111
+ }
67112
+ },
67113
+ {
67114
+ "block": "values",
67115
+ "props": {
67116
+ "heading": "The values Block",
67117
+ "items": [
67118
+ {
67119
+ "title": "One",
67120
+ "text": "Cards on a tinted band."
67121
+ },
67122
+ {
67123
+ "title": "Two",
67124
+ "text": "Good for what you stand for."
67125
+ },
67126
+ {
67127
+ "title": "Three",
67128
+ "text": "Or for how you work."
67129
+ }
67130
+ ]
67131
+ }
67132
+ },
67133
+ {
67134
+ "block": "cta",
67135
+ "props": {
67136
+ "heading": "The call to action Block",
67137
+ "text": "One clear thing to do next.",
67138
+ "cta": {
67139
+ "label": "Do the thing",
67140
+ "href": "#"
67141
+ }
67142
+ }
67143
+ },
67144
+ {
67145
+ "block": "contact",
67146
+ "props": {
67147
+ "heading": "The contact Block",
67148
+ "intro": "Contact details, each on its own card.",
67149
+ "email": "hello@example.com",
67150
+ "phone": "+1 555 010 0199",
67151
+ "address": "1 Pixel Street, Tile City"
66821
67152
  }
66822
67153
  }
66823
67154
  ]
@@ -66837,14 +67168,7 @@ var pixelOfficeKit = {
66837
67168
  var PIXEL_OFFICE_README = [
66838
67169
  "# Pixel Office",
66839
67170
  "",
66840
- "A free, MIT-licensed BLKC Kit. The goal is a pixel-art office for your project, with",
66841
- "your AI coding agents as animated characters.",
66842
- "",
66843
- "## Status",
66844
- "",
66845
- "This first release is a **theme and a landing page**. The office is not built yet: it",
66846
- "needs the `canvas` renderer target, which the BLKC format reserves but no renderer",
66847
- "implements.",
67171
+ "A free, MIT-licensed BLKC Kit: a living pixel-art office for your project. Your agents and tasks become characters and quests.",
66848
67172
  "",
66849
67173
  "## Run it",
66850
67174
  "",
@@ -66852,10 +67176,33 @@ var PIXEL_OFFICE_README = [
66852
67176
  "npx @blkc-code/cli@latest dev",
66853
67177
  "```",
66854
67178
  "",
66855
- "This opens a preview in your browser and reloads when you save. Edit `kit.json`: the",
66856
- "colours and font are under `theme`, and the words and sections under `content.pages`.",
67179
+ "This opens a preview in your browser and reloads when you save. Click someone in the office to see what they are doing. The Every Block page shows each web Block with this theme.",
67180
+ "",
67181
+ "## Make it your own",
67182
+ "",
67183
+ "Everything is in `kit.json`:",
67184
+ "",
67185
+ "- **Colours and fonts:** `theme`.",
67186
+ "- **Words and sections:** `content.pages`.",
67187
+ "- **The team and quests:** the `office` Block's `agents` and `tasks`.",
67188
+ "- **The building:** give the `office` Block `cols`, `rows`, `rooms`, `doors` and `furniture`. Leave them out for the standard layout.",
67189
+ "",
67190
+ "An agent's `state` is one of `working`, `thinking`, `blocked`, `reviewing`, `idle`, `done` or `away`. Furniture types are `desk`, `coffee`, `water`, `sofa`, `plant`, `board`, `shelf`, `server`, `table` and `rug`.",
66857
67191
  "",
66858
- "To render it inside your own site instead:",
67192
+ "## Connect real work",
67193
+ "",
67194
+ "While `blkc dev` is running, anything can update the office by writing `office-state.json` beside `kit.json`:",
67195
+ "",
67196
+ "```json",
67197
+ "{",
67198
+ ' "agents": [{ "id": "nova", "name": "Nova", "state": "blocked", "task": "Needs a password" }],',
67199
+ ' "tasks": [{ "title": "Ship it", "state": "doing" }]',
67200
+ "}",
67201
+ "```",
67202
+ "",
67203
+ "A script, a build or a hook from your coding agent can write that file. BLKC does not connect to any agent for you yet.",
67204
+ "",
67205
+ "## Put it on your own site",
66859
67206
  "",
66860
67207
  "```js",
66861
67208
  'import { readFileSync } from "node:fs";',
@@ -66865,13 +67212,11 @@ var PIXEL_OFFICE_README = [
66865
67212
  'const { html } = renderToHTML(kit, "home");',
66866
67213
  "```",
66867
67214
  "",
66868
- "The markup uses Tailwind classes. If your site has no Tailwind, add",
66869
- "`@blkc-code/render-web/styles.css`.",
67215
+ "Then, on the page, add `@blkc-code/render-web/styles.css` and call `mountCanvasBlocks()` from `@blkc-code/render-canvas`, or load its `runtime.js` in a script tag.",
66870
67216
  "",
66871
67217
  "## Credits",
66872
67218
  "",
66873
- "Inspired by [Pixel Agents](https://github.com/pixel-agents-hq/pixel-agents) by Pablo De",
66874
- "Lucca, MIT licensed. See [NOTICE](./NOTICE). No Pixel Agents code or art is included yet."
67219
+ "Inspired by [Pixel Agents](https://github.com/pixel-agents-hq/pixel-agents) by Pablo De Lucca, MIT licensed. See [NOTICE](./NOTICE). The art here is original."
66875
67220
  ].join("\n") + "\n";
66876
67221
  var PIXEL_OFFICE_NOTICE = [
66877
67222
  "Pixel Office Kit",
@@ -66881,8 +67226,9 @@ var PIXEL_OFFICE_NOTICE = [
66881
67226
  "https://github.com/pixel-agents-hq/pixel-agents",
66882
67227
  "Copyright (c) 2026 Pablo De Lucca. MIT licensed.",
66883
67228
  "",
66884
- "No Pixel Agents code or art is included in this Kit yet. Anything imported from it",
66885
- "later must keep that project's copyright and licence notice here."
67229
+ "Asset provenance: all characters, furniture, floors and walls are original work, drawn",
67230
+ "in code in @blkc-code/render-canvas. No Pixel Agents code or art is included. Anything",
67231
+ "imported from it later must keep that project's copyright and licence notice here."
66886
67232
  ].join("\n") + "\n";
66887
67233
  var PIXEL_OFFICE_TEST = `import assert from "node:assert/strict";
66888
67234
  import { readFileSync } from "node:fs";
@@ -67005,7 +67351,7 @@ async function readSource(kind, source, cwd) {
67005
67351
  } catch (error62) {
67006
67352
  const template = kind === "kit" ? KIT_TEMPLATES[source] : void 0;
67007
67353
  if (!template) throw error62;
67008
- const files = new Map(Object.entries(template).map(([name, text2]) => [name, import_node_buffer.Buffer.from(text2)]));
67354
+ const files = new Map(Object.entries(template).map(([name, text3]) => [name, import_node_buffer.Buffer.from(text3)]));
67009
67355
  return { files, label };
67010
67356
  }
67011
67357
  }
@@ -67347,6 +67693,7 @@ Run \`blkc check\` to validate it and \`node --test\` to run its test.
67347
67693
 
67348
67694
  // src/commands/dev.ts
67349
67695
  var import_node_child_process = require("node:child_process");
67696
+ var import_node_crypto = require("node:crypto");
67350
67697
  var import_node_fs3 = require("node:fs");
67351
67698
  var import_promises11 = require("node:fs/promises");
67352
67699
  var import_node_http = require("node:http");
@@ -67365,6 +67712,7 @@ __export(dist_exports, {
67365
67712
  ImageBlock: () => ImageBlock,
67366
67713
  KitPage: () => KitPage,
67367
67714
  ManifestPreview: () => ManifestPreview,
67715
+ OfficeBlock: () => OfficeBlock,
67368
67716
  SectionBlock: () => SectionBlock,
67369
67717
  ServicesBlock: () => ServicesBlock,
67370
67718
  StoryBlock: () => StoryBlock,
@@ -67411,12 +67759,13 @@ __export(dist_exports, {
67411
67759
  renderPage: () => renderPage,
67412
67760
  resolveKitPage: () => resolveKitPage,
67413
67761
  richTextToHtml: () => richTextToHtml,
67762
+ safeJson: () => safeJson,
67414
67763
  themeJsonToVariables: () => themeJsonToVariables,
67415
67764
  themeToCss: () => themeToCss,
67416
67765
  themeToStyle: () => themeToStyle,
67417
67766
  unregisterBlock: () => unregisterBlock
67418
67767
  });
67419
- var import_jsx_runtime4 = __toESM(require_jsx_runtime(), 1);
67768
+ var import_jsx_runtime5 = __toESM(require_jsx_runtime(), 1);
67420
67769
  var import_react3 = __toESM(require_react(), 1);
67421
67770
 
67422
67771
  // ../render-web/dist/clsx.js
@@ -67449,7 +67798,9 @@ var DEFAULT_THEME = {
67449
67798
  "--blkc-color-background": "#ffffff",
67450
67799
  "--blkc-color-text": "#1a1a1a",
67451
67800
  "--blkc-color-text-secondary": "#6c757d",
67452
- "--blkc-color-border": "#e0e0e0",
67801
+ "--blkc-color-border": "color-mix(in srgb, var(--blkc-color-text, #1a1a1a) 16%, var(--blkc-color-background, #ffffff))",
67802
+ "--blkc-color-surface": "color-mix(in srgb, var(--blkc-color-text, #1a1a1a) 6%, var(--blkc-color-background, #ffffff))",
67803
+ "--blkc-color-accent": "var(--blkc-color-primary, #0066cc)",
67453
67804
  // Typography
67454
67805
  "--blkc-font-family": "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif",
67455
67806
  "--blkc-font-size-base": "1rem",
@@ -67663,7 +68014,7 @@ function getBooleanProp(props, key, defaultValue) {
67663
68014
  function normalizeUrl(url2) {
67664
68015
  if (!url2)
67665
68016
  return void 0;
67666
- if (!url2.startsWith("http://") && !url2.startsWith("https://") && !url2.startsWith("/") && !url2.startsWith("#") && !url2.startsWith("mailto:") && !url2.startsWith("tel:")) {
68017
+ if (!url2.startsWith("http://") && !url2.startsWith("https://") && !url2.startsWith("/") && !url2.startsWith("#") && !url2.startsWith("mailto:") && !url2.startsWith("tel:") && !url2.startsWith("data:image/")) {
67667
68018
  return `https://${url2}`;
67668
68019
  }
67669
68020
  return url2;
@@ -67736,8 +68087,8 @@ var SAFE_SCHEME = /^(https?:|mailto:|tel:|\/(?![/\\&])|#)/i;
67736
68087
  var HTTP_SCHEME = /^https?:/i;
67737
68088
  var CONTROL_CHARS = /[\u0000-\u001f\u007f]/;
67738
68089
  var BARE_AMPERSAND = /&(?!(?:[a-z][a-z0-9]*|#\d+|#x[0-9a-f]+);)/gi;
67739
- function escapeText(text2) {
67740
- return text2.replace(BARE_AMPERSAND, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
68090
+ function escapeText(text3) {
68091
+ return text3.replace(BARE_AMPERSAND, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
67741
68092
  }
67742
68093
  function escapeAttr(value) {
67743
68094
  return escapeText(value).replace(/"/g, "&quot;");
@@ -67828,8 +68179,8 @@ var NODE_TAGS = {
67828
68179
  listItem: "li",
67829
68180
  blockquote: "blockquote"
67830
68181
  };
67831
- function escapeHtml(text2) {
67832
- return text2.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
68182
+ function escapeHtml(text3) {
68183
+ return text3.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
67833
68184
  }
67834
68185
  function textNode(node2) {
67835
68186
  let html = escapeHtml(node2.text ?? "");
@@ -67862,33 +68213,72 @@ function richTextToHtml(value) {
67862
68213
  }
67863
68214
 
67864
68215
  // ../render-web/dist/sections.js
67865
- var BAND = "w-full px-4 py-16 sm:py-20";
68216
+ var BAND = "w-full px-6 py-16 sm:py-24";
67866
68217
  var INNER = "mx-auto flex w-full max-w-blkc flex-col gap-8";
67867
- var HEADING = "text-3xl font-bold tracking-tight sm:text-4xl";
67868
- var LEAD = "max-w-2xl text-lg text-muted-foreground";
67869
- var BUTTON = "inline-flex w-fit items-center justify-center rounded-md bg-primary px-6 py-3 text-base font-semibold text-primary-foreground transition-colors hover:bg-primary/90 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring";
67870
- function CardGrid({ items, showLinks }) {
67871
- return (0, import_jsx_runtime.jsx)("ul", { className: "grid list-none gap-6 p-0 sm:grid-cols-2 lg:grid-cols-3", children: items.map((item, index) => (0, import_jsx_runtime.jsxs)("li", { className: "flex flex-col gap-2 rounded-lg border border-border p-6", children: [(0, import_jsx_runtime.jsx)("h3", { className: "text-xl font-semibold", children: item.title }), item.text && (0, import_jsx_runtime.jsx)("p", { className: "text-muted-foreground", children: item.text }), showLinks && item.link && (0, import_jsx_runtime.jsx)("a", { href: normalizeUrl(item.link.href), className: "mt-auto font-medium text-primary underline-offset-4 hover:underline", children: item.link.label })] }, index)) });
68218
+ var HEADING = "blkc-heading text-3xl font-bold tracking-tight text-balance sm:text-4xl";
68219
+ var LEAD = "max-w-2xl text-lg text-muted-foreground text-pretty";
68220
+ var BUTTON = "inline-flex w-fit items-center justify-center rounded-lg bg-accent-foreground px-7 py-3.5 text-base font-semibold text-accent no-underline shadow-md transition-all hover:-translate-y-0.5 hover:shadow-lg focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring";
68221
+ function CardGrid({ items, showLinks, surface }) {
68222
+ return (0, import_jsx_runtime.jsx)("ul", { className: "grid list-none gap-6 p-0 sm:grid-cols-2 lg:grid-cols-3", children: items.map((item, index) => (0, import_jsx_runtime.jsxs)("li", { className: clsx("flex flex-col gap-3 rounded-xl border border-border p-6 shadow-sm transition-all hover:-translate-y-0.5 hover:shadow-md", surface), children: [(0, import_jsx_runtime.jsx)("h3", { className: "text-xl font-semibold", children: item.title }), item.text && (0, import_jsx_runtime.jsx)("p", { className: "text-muted-foreground", children: item.text }), showLinks && item.link && (0, import_jsx_runtime.jsx)("a", { href: normalizeUrl(item.link.href), className: "mt-auto font-medium text-primary underline-offset-4 hover:underline", children: item.link.label })] }, index)) });
67872
68223
  }
67873
68224
  function ServicesBlock({ props: p2, className, style }) {
67874
- return (0, import_jsx_runtime.jsx)("section", { className: clsx("blkc-services", BAND, className), style, children: (0, import_jsx_runtime.jsxs)("div", { className: INNER, children: [(0, import_jsx_runtime.jsx)("h2", { className: HEADING, children: p2.heading }), p2.intro && (0, import_jsx_runtime.jsx)("p", { className: LEAD, children: p2.intro }), (0, import_jsx_runtime.jsx)(CardGrid, { items: p2.items ?? [], showLinks: true })] }) });
68225
+ return (0, import_jsx_runtime.jsx)("section", { className: clsx("blkc-services", BAND, className), style, children: (0, import_jsx_runtime.jsxs)("div", { className: INNER, children: [(0, import_jsx_runtime.jsx)("h2", { className: HEADING, children: p2.heading }), p2.intro && (0, import_jsx_runtime.jsx)("p", { className: LEAD, children: p2.intro }), (0, import_jsx_runtime.jsx)(CardGrid, { items: p2.items ?? [], showLinks: true, surface: "bg-muted" })] }) });
67875
68226
  }
67876
68227
  function StoryBlock({ props: p2, className, style }) {
67877
68228
  const body = richTextToHtml(p2.body);
67878
- return (0, import_jsx_runtime.jsx)("section", { className: clsx("blkc-story", BAND, className), style, children: (0, import_jsx_runtime.jsxs)("div", { className: "mx-auto grid w-full max-w-blkc items-center gap-10 md:grid-cols-2", children: [(0, import_jsx_runtime.jsxs)("div", { className: clsx("flex flex-col gap-4", p2.imageSide === "left" && "md:order-2"), children: [(0, import_jsx_runtime.jsx)("h2", { className: HEADING, children: p2.heading }), body && (0, import_jsx_runtime.jsx)("div", { className: "flex flex-col gap-3 leading-relaxed", dangerouslySetInnerHTML: { __html: body } })] }), p2.image && (0, import_jsx_runtime.jsx)("img", { src: p2.image.src, alt: p2.image.alt, className: "h-auto w-full rounded-lg object-cover" })] }) });
68229
+ return (0, import_jsx_runtime.jsx)("section", { className: clsx("blkc-story", BAND, className), style, children: (0, import_jsx_runtime.jsxs)("div", { className: "mx-auto grid w-full max-w-blkc items-center gap-10 md:grid-cols-2", children: [(0, import_jsx_runtime.jsxs)("div", { className: clsx("flex flex-col gap-4", p2.imageSide === "left" && "md:order-2"), children: [(0, import_jsx_runtime.jsx)("h2", { className: HEADING, children: p2.heading }), body && (0, import_jsx_runtime.jsx)("div", { className: "flex flex-col gap-3 text-lg leading-relaxed text-muted-foreground [&_strong]:text-foreground", dangerouslySetInnerHTML: { __html: body } })] }), p2.image && (0, import_jsx_runtime.jsx)("img", { src: p2.image.src, alt: p2.image.alt, className: "h-auto w-full rounded-2xl border border-border object-cover shadow-lg" })] }) });
67879
68230
  }
67880
68231
  function ValuesBlock({ props: p2, className, style }) {
67881
- return (0, import_jsx_runtime.jsx)("section", { className: clsx("blkc-values bg-muted", BAND, className), style, children: (0, import_jsx_runtime.jsxs)("div", { className: INNER, children: [(0, import_jsx_runtime.jsx)("h2", { className: HEADING, children: p2.heading }), (0, import_jsx_runtime.jsx)(CardGrid, { items: p2.items ?? [], showLinks: false })] }) });
68232
+ return (0, import_jsx_runtime.jsx)("section", { className: clsx("blkc-values bg-muted", BAND, className), style, children: (0, import_jsx_runtime.jsxs)("div", { className: INNER, children: [(0, import_jsx_runtime.jsx)("h2", { className: HEADING, children: p2.heading }), (0, import_jsx_runtime.jsx)(CardGrid, { items: p2.items ?? [], showLinks: false, surface: "bg-background" })] }) });
67882
68233
  }
67883
68234
  function CtaBlock({ props: p2, className, style }) {
67884
- return (0, import_jsx_runtime.jsx)("section", { className: clsx("blkc-cta bg-accent text-accent-foreground", BAND, className), style, children: (0, import_jsx_runtime.jsxs)("div", { className: clsx(INNER, "items-center text-center"), children: [(0, import_jsx_runtime.jsx)("h2", { className: HEADING, children: p2.heading }), p2.text && (0, import_jsx_runtime.jsx)("p", { className: "max-w-2xl text-lg", children: p2.text }), p2.cta && (0, import_jsx_runtime.jsx)("a", { href: normalizeUrl(p2.cta.href), className: BUTTON, children: p2.cta.label })] }) });
68235
+ return (0, import_jsx_runtime.jsx)("section", { className: clsx("blkc-cta", BAND, className), style, children: (0, import_jsx_runtime.jsxs)("div", { className: clsx(INNER, "items-center rounded-3xl bg-accent px-6 py-14 text-center text-accent-foreground shadow-lg sm:py-20"), children: [(0, import_jsx_runtime.jsx)("h2", { className: HEADING, children: p2.heading }), p2.text && (0, import_jsx_runtime.jsx)("p", { className: "max-w-2xl text-lg", children: p2.text }), p2.cta && (0, import_jsx_runtime.jsx)("a", { href: normalizeUrl(p2.cta.href), className: BUTTON, children: p2.cta.label })] }) });
67885
68236
  }
67886
68237
  function ContactBlock({ props: p2, className, style }) {
67887
- return (0, import_jsx_runtime.jsx)("section", { className: clsx("blkc-contact", BAND, className), style, children: (0, import_jsx_runtime.jsxs)("div", { className: INNER, children: [(0, import_jsx_runtime.jsx)("h2", { className: HEADING, children: p2.heading }), p2.intro && (0, import_jsx_runtime.jsx)("p", { className: LEAD, children: p2.intro }), (0, import_jsx_runtime.jsxs)("address", { className: "flex flex-col gap-2 not-italic", children: [p2.email && (0, import_jsx_runtime.jsx)("a", { href: `mailto:${encodeURI(p2.email)}`, className: "text-primary underline-offset-4 hover:underline", children: p2.email }), p2.phone && (0, import_jsx_runtime.jsx)("a", { href: `tel:${p2.phone.replace(/[^+\d]/g, "")}`, className: "text-primary underline-offset-4 hover:underline", children: p2.phone }), p2.address && (0, import_jsx_runtime.jsx)("span", { children: p2.address })] })] }) });
68238
+ return (0, import_jsx_runtime.jsx)("section", { className: clsx("blkc-contact", BAND, className), style, children: (0, import_jsx_runtime.jsxs)("div", { className: INNER, children: [(0, import_jsx_runtime.jsx)("h2", { className: HEADING, children: p2.heading }), p2.intro && (0, import_jsx_runtime.jsx)("p", { className: LEAD, children: p2.intro }), (0, import_jsx_runtime.jsxs)("address", { className: "grid gap-4 not-italic sm:grid-cols-2 lg:grid-cols-3 [&>*]:rounded-xl [&>*]:border [&>*]:border-border [&>*]:bg-muted [&>*]:p-6 [&>*]:font-medium [&>*]:shadow-sm", children: [p2.email && (0, import_jsx_runtime.jsx)("a", { href: `mailto:${encodeURI(p2.email)}`, className: "text-primary underline-offset-4 hover:underline", children: p2.email }), p2.phone && (0, import_jsx_runtime.jsx)("a", { href: `tel:${p2.phone.replace(/[^+\d]/g, "")}`, className: "text-primary underline-offset-4 hover:underline", children: p2.phone }), p2.address && (0, import_jsx_runtime.jsx)("span", { children: p2.address })] })] }) });
67888
68239
  }
67889
68240
 
67890
- // ../render-web/dist/kit.js
68241
+ // ../render-web/dist/office.js
67891
68242
  var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1);
68243
+ var STATE_LABEL = {
68244
+ working: "Working",
68245
+ thinking: "Thinking",
68246
+ blocked: "Blocked",
68247
+ reviewing: "Reviewing",
68248
+ idle: "On a break",
68249
+ done: "Finished",
68250
+ away: "Away"
68251
+ };
68252
+ var STATE_CLASS = {
68253
+ working: "bg-emerald-500",
68254
+ thinking: "bg-sky-500",
68255
+ blocked: "bg-red-500",
68256
+ reviewing: "bg-violet-500",
68257
+ idle: "bg-amber-500",
68258
+ done: "bg-yellow-400",
68259
+ away: "bg-zinc-400"
68260
+ };
68261
+ var TASK_MARK = { todo: "bg-amber-300", doing: "bg-sky-400", done: "bg-emerald-400" };
68262
+ var text = (value) => typeof value === "string" ? value : "";
68263
+ var array2 = (value) => Array.isArray(value) ? value : [];
68264
+ function safeJson(value) {
68265
+ return JSON.stringify(value).replace(/</g, "\\u003c").replace(new RegExp("\\u2028", "g"), "\\u2028").replace(new RegExp("\\u2029", "g"), "\\u2029");
68266
+ }
68267
+ function OfficeBlock({ props: p2, className, style }) {
68268
+ const agents = array2(p2.agents);
68269
+ const tasks = array2(p2.tasks);
68270
+ const done = tasks.filter((task) => task.state === "done").length;
68271
+ const percent = tasks.length > 0 ? Math.round(done / tasks.length * 100) : 0;
68272
+ const scene = { cols: p2.cols, rows: p2.rows, rooms: p2.rooms, doors: p2.doors, furniture: p2.furniture, agents, tasks };
68273
+ const heading = text(p2.heading);
68274
+ return (0, import_jsx_runtime2.jsx)("section", { className: clsx("blkc-office w-full px-6 py-16 sm:py-20", className), style, "data-blkc-canvas-root": "", children: (0, import_jsx_runtime2.jsxs)("div", { className: "mx-auto flex w-full max-w-blkc flex-col gap-8", children: [(heading || p2.intro) && (0, import_jsx_runtime2.jsxs)("header", { className: "flex max-w-2xl flex-col gap-3", children: [heading && (0, import_jsx_runtime2.jsx)("h2", { className: "blkc-heading text-3xl font-bold tracking-tight text-balance sm:text-4xl", children: heading }), p2.intro && (0, import_jsx_runtime2.jsx)("p", { className: "text-lg text-muted-foreground", children: text(p2.intro) })] }), (0, import_jsx_runtime2.jsxs)("div", { className: "grid items-start gap-6 lg:grid-cols-[minmax(0,1fr)_20rem]", children: [(0, import_jsx_runtime2.jsxs)("div", { className: "overflow-hidden rounded-xl border border-border bg-muted shadow-lg", children: [(0, import_jsx_runtime2.jsx)("canvas", { "data-blkc-canvas": "office", role: "img", "aria-label": `${heading || "Pixel office"}: ${agents.length} people. Their status is listed beside this picture.`, className: "block aspect-[26/17] h-auto w-full touch-manipulation [image-rendering:pixelated]", style: p2.cols && p2.rows ? { aspectRatio: `${p2.cols} / ${p2.rows}` } : void 0 }), (0, import_jsx_runtime2.jsx)("script", { type: "application/json", "data-blkc-canvas-data": "", dangerouslySetInnerHTML: { __html: safeJson(scene) } })] }), (0, import_jsx_runtime2.jsxs)("aside", { className: "flex flex-col gap-6", children: [agents.length > 0 && (0, import_jsx_runtime2.jsxs)("div", { className: "flex flex-col gap-2", children: [(0, import_jsx_runtime2.jsx)("h3", { className: "text-sm font-semibold uppercase tracking-wide text-muted-foreground", children: "The team" }), (0, import_jsx_runtime2.jsx)("ul", { className: "m-0 flex list-none flex-col gap-1.5 p-0", children: agents.map((agent, index) => {
68275
+ const state = text(agent.state) || "idle";
68276
+ return (0, import_jsx_runtime2.jsx)("li", { children: (0, import_jsx_runtime2.jsxs)("button", { type: "button", disabled: true, "aria-pressed": "false", "data-blkc-agent": text(agent.id), className: "flex w-full cursor-pointer items-start gap-3 rounded-lg border border-border bg-background px-3 py-2 text-left text-inherit transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-default aria-pressed:border-primary aria-pressed:bg-muted", children: [(0, import_jsx_runtime2.jsx)("span", { className: clsx("mt-1.5 size-2.5 shrink-0 rounded-full", STATE_CLASS[state] ?? "bg-zinc-400"), "aria-hidden": "true" }), (0, import_jsx_runtime2.jsxs)("span", { className: "flex min-w-0 flex-col", children: [(0, import_jsx_runtime2.jsxs)("span", { className: "text-sm font-semibold", children: [text(agent.name) || text(agent.id), (0, import_jsx_runtime2.jsxs)("span", { className: "font-normal text-muted-foreground", children: [" \xB7 ", STATE_LABEL[state] ?? state] })] }), text(agent.task) && (0, import_jsx_runtime2.jsx)("span", { className: "text-sm text-muted-foreground", children: text(agent.task) })] })] }) }, index);
68277
+ }) })] }), tasks.length > 0 && (0, import_jsx_runtime2.jsxs)("div", { className: "flex flex-col gap-2", children: [(0, import_jsx_runtime2.jsxs)("h3", { className: "text-sm font-semibold uppercase tracking-wide text-muted-foreground", children: ["Quests: ", done, " of ", tasks.length, " done"] }), (0, import_jsx_runtime2.jsx)("div", { className: "h-2 overflow-hidden rounded-full bg-muted", role: "progressbar", "aria-valuemin": 0, "aria-valuemax": 100, "aria-valuenow": percent, "aria-label": "Quests finished", children: (0, import_jsx_runtime2.jsx)("div", { className: "h-full rounded-full bg-primary", style: { width: `${percent}%` } }) }), (0, import_jsx_runtime2.jsx)("ul", { className: "m-0 flex list-none flex-col gap-1 p-0 text-sm", children: tasks.map((task, index) => (0, import_jsx_runtime2.jsxs)("li", { className: clsx("flex items-start gap-2", task.state === "done" && "text-muted-foreground line-through"), children: [(0, import_jsx_runtime2.jsx)("span", { className: clsx("mt-1 size-3 shrink-0 rounded-sm", TASK_MARK[text(task.state)] ?? TASK_MARK["todo"]), "aria-hidden": "true" }), (0, import_jsx_runtime2.jsx)("span", { children: text(task.title) })] }, index)) })] })] })] })] }) });
68278
+ }
68279
+
68280
+ // ../render-web/dist/kit.js
68281
+ var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1);
67892
68282
  var import_react = __toESM(require_react(), 1);
67893
68283
  function resolveKitPage(kit, page) {
67894
68284
  const pages = kit.content?.pages ?? [];
@@ -67904,17 +68294,17 @@ function kitPageStyle(kit) {
67904
68294
  function KitPage({ kit, page, options }) {
67905
68295
  const instances = resolveKitPage(kit, page);
67906
68296
  if (!instances) {
67907
- return (0, import_jsx_runtime2.jsx)("div", { className: "blkc-page", children: (0, import_jsx_runtime2.jsxs)("p", { children: ["Page not found: ", page] }) });
68297
+ return (0, import_jsx_runtime3.jsx)("div", { className: "blkc-page", children: (0, import_jsx_runtime3.jsxs)("p", { children: ["Page not found: ", page] }) });
67908
68298
  }
67909
68299
  const { elements } = renderBlocks(instances, options ?? {});
67910
- return (0, import_jsx_runtime2.jsx)("div", { className: "blkc-page", style: kitPageStyle(kit), children: elements.map((element, index) => (0, import_jsx_runtime2.jsx)(import_react.default.Fragment, { children: element }, index)) });
68300
+ return (0, import_jsx_runtime3.jsx)("div", { className: "blkc-page", style: kitPageStyle(kit), children: elements.map((element, index) => (0, import_jsx_runtime3.jsx)(import_react.default.Fragment, { children: element }, index)) });
67911
68301
  }
67912
68302
 
67913
68303
  // ../render-web/dist/preview.js
67914
- var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1);
68304
+ var import_jsx_runtime4 = __toESM(require_jsx_runtime(), 1);
67915
68305
  var import_react2 = __toESM(require_react(), 1);
67916
68306
  var rows = (value) => Array.isArray(value) ? value : [];
67917
- var text = (value) => typeof value === "string" ? value : "";
68307
+ var text2 = (value) => typeof value === "string" ? value : "";
67918
68308
  var strings = (value) => Array.isArray(value) ? value.filter((v) => typeof v === "string") : [];
67919
68309
  function manifestKind(manifest) {
67920
68310
  if (typeof manifest !== "object" || manifest === null || Array.isArray(manifest))
@@ -67931,76 +68321,76 @@ function manifestKind(manifest) {
67931
68321
  function kitPages(manifest) {
67932
68322
  const content = manifest?.content;
67933
68323
  return rows(content?.pages).map((page) => ({
67934
- slug: text(page.slug) || "home",
67935
- title: text(page.title) || text(page.slug) || "Home"
68324
+ slug: text2(page.slug) || "home",
68325
+ title: text2(page.title) || text2(page.slug) || "Home"
67936
68326
  }));
67937
68327
  }
67938
68328
  function Note({ children }) {
67939
- return (0, import_jsx_runtime3.jsx)("div", { className: "mx-auto my-6 w-full max-w-3xl rounded-lg border border-border p-4 text-sm text-muted-foreground", children });
68329
+ return (0, import_jsx_runtime4.jsx)("div", { className: "mx-auto my-6 w-full max-w-3xl rounded-lg border border-border p-4 text-sm text-muted-foreground", children });
67940
68330
  }
67941
68331
  function Card({ title: title3, summary, label, children }) {
67942
- return (0, import_jsx_runtime3.jsxs)("div", { className: "mx-auto flex w-full max-w-5xl flex-col gap-6 px-4 py-10", children: [(0, import_jsx_runtime3.jsxs)("header", { className: "flex flex-col gap-2", children: [(0, import_jsx_runtime3.jsx)("p", { className: "text-sm font-medium uppercase tracking-wide text-muted-foreground", children: label }), (0, import_jsx_runtime3.jsx)("h1", { className: "text-3xl font-bold tracking-tight", children: title3 }), summary && (0, import_jsx_runtime3.jsx)("p", { className: "text-lg text-muted-foreground", children: summary })] }), children] });
68332
+ return (0, import_jsx_runtime4.jsxs)("div", { className: "mx-auto flex w-full max-w-5xl flex-col gap-6 px-4 py-10", children: [(0, import_jsx_runtime4.jsxs)("header", { className: "flex flex-col gap-2", children: [(0, import_jsx_runtime4.jsx)("p", { className: "text-sm font-medium uppercase tracking-wide text-muted-foreground", children: label }), (0, import_jsx_runtime4.jsx)("h1", { className: "text-3xl font-bold tracking-tight", children: title3 }), summary && (0, import_jsx_runtime4.jsx)("p", { className: "text-lg text-muted-foreground", children: summary })] }), children] });
67943
68333
  }
67944
68334
  function ListSection({ title: title3, items }) {
67945
68335
  if (items.length === 0)
67946
68336
  return null;
67947
- return (0, import_jsx_runtime3.jsxs)("section", { className: "flex flex-col gap-2", children: [(0, import_jsx_runtime3.jsx)("h2", { className: "text-lg font-semibold", children: title3 }), (0, import_jsx_runtime3.jsx)("ul", { className: "flex flex-col gap-1 text-sm", children: items.map((item, index) => (0, import_jsx_runtime3.jsx)("li", { className: "rounded-lg border border-border px-3 py-2", children: item }, index)) })] });
68337
+ return (0, import_jsx_runtime4.jsxs)("section", { className: "flex flex-col gap-2", children: [(0, import_jsx_runtime4.jsx)("h2", { className: "text-lg font-semibold", children: title3 }), (0, import_jsx_runtime4.jsx)("ul", { className: "flex flex-col gap-1 text-sm", children: items.map((item, index) => (0, import_jsx_runtime4.jsx)("li", { className: "rounded-lg border border-border px-3 py-2", children: item }, index)) })] });
67948
68338
  }
67949
68339
  function BlockPreview({ manifest }) {
67950
- const id = text(manifest.id);
67951
- const name = text(manifest.name) || id;
67952
- const summary = text(manifest.summary);
68340
+ const id = text2(manifest.id);
68341
+ const name = text2(manifest.name) || id;
68342
+ const summary = text2(manifest.summary);
67953
68343
  if (manifest.kind === "capability" || manifest.entryPoint) {
67954
- return (0, import_jsx_runtime3.jsxs)(Card, { title: name, summary, label: "Capability Block", children: [(0, import_jsx_runtime3.jsx)(Note, { children: "A capability Block runs code and has no page to draw, so this shows what it takes and returns." }), (0, import_jsx_runtime3.jsx)(ListSection, { title: "Inputs", items: strings(manifest.inputs) }), (0, import_jsx_runtime3.jsx)(ListSection, { title: "Outputs", items: strings(manifest.outputs) })] });
68344
+ return (0, import_jsx_runtime4.jsxs)(Card, { title: name, summary, label: "Capability Block", children: [(0, import_jsx_runtime4.jsx)(Note, { children: "A capability Block runs code and has no page to draw, so this shows what it takes and returns." }), (0, import_jsx_runtime4.jsx)(ListSection, { title: "Inputs", items: strings(manifest.inputs) }), (0, import_jsx_runtime4.jsx)(ListSection, { title: "Outputs", items: strings(manifest.outputs) })] });
67955
68345
  }
67956
68346
  const example = manifest.example ?? {};
67957
68347
  if (isBlockRegistered(id)) {
67958
68348
  const result = renderBlock({ block: id, props: example });
67959
68349
  if (result.success)
67960
68350
  return result.element;
67961
- return (0, import_jsx_runtime3.jsxs)(Note, { children: ['Block "', id, '" could not render its example: ', result.error] });
68351
+ return (0, import_jsx_runtime4.jsxs)(Note, { children: ['Block "', id, '" could not render its example: ', result.error] });
67962
68352
  }
67963
68353
  const attributes = Object.entries(manifest.attributes ?? {});
67964
- return (0, import_jsx_runtime3.jsxs)(Card, { title: name, summary, label: "UI Block", children: [(0, import_jsx_runtime3.jsxs)(Note, { children: ['There is no component registered for "', id, '" yet, so this shows its attributes and example. Register one with registerBlock() to see it drawn.'] }), (0, import_jsx_runtime3.jsx)(ListSection, { title: "Attributes", items: attributes.map(([key, a2]) => `${key}: ${text(a2.type) || "unknown"}${a2.required ? " (required)" : ""}`) }), Object.keys(example).length > 0 && (0, import_jsx_runtime3.jsxs)("section", { className: "flex flex-col gap-2", children: [(0, import_jsx_runtime3.jsx)("h2", { className: "text-lg font-semibold", children: "Example" }), (0, import_jsx_runtime3.jsx)("pre", { className: "overflow-x-auto rounded-lg border border-border p-3 text-xs", children: JSON.stringify(example, null, 2) })] })] });
68354
+ return (0, import_jsx_runtime4.jsxs)(Card, { title: name, summary, label: "UI Block", children: [(0, import_jsx_runtime4.jsxs)(Note, { children: ['There is no component registered for "', id, '" yet, so this shows its attributes and example. Register one with registerBlock() to see it drawn.'] }), (0, import_jsx_runtime4.jsx)(ListSection, { title: "Attributes", items: attributes.map(([key, a2]) => `${key}: ${text2(a2.type) || "unknown"}${a2.required ? " (required)" : ""}`) }), Object.keys(example).length > 0 && (0, import_jsx_runtime4.jsxs)("section", { className: "flex flex-col gap-2", children: [(0, import_jsx_runtime4.jsx)("h2", { className: "text-lg font-semibold", children: "Example" }), (0, import_jsx_runtime4.jsx)("pre", { className: "overflow-x-auto rounded-lg border border-border p-3 text-xs", children: JSON.stringify(example, null, 2) })] })] });
67965
68355
  }
67966
68356
  function KitPreview({ manifest, page }) {
67967
- const name = text(manifest.name) || text(manifest.id);
68357
+ const name = text2(manifest.name) || text2(manifest.id);
67968
68358
  const pages = kitPages(manifest);
67969
68359
  if (pages.length === 0) {
67970
- return (0, import_jsx_runtime3.jsxs)(Note, { children: [name, " has no pages yet. Add one to pages/home.json or to content.pages in kit.json."] });
68360
+ return (0, import_jsx_runtime4.jsxs)(Note, { children: [name, " has no pages yet. Add one to pages/home.json or to content.pages in kit.json."] });
67971
68361
  }
67972
68362
  const slug = page ?? pages[0].slug;
67973
68363
  const instances = resolveKitPage(manifest, slug);
67974
68364
  if (!instances)
67975
- return (0, import_jsx_runtime3.jsxs)(Note, { children: [name, ' has no page called "', slug, '".'] });
68365
+ return (0, import_jsx_runtime4.jsxs)(Note, { children: [name, ' has no page called "', slug, '".'] });
67976
68366
  if (instances.length === 0) {
67977
- return (0, import_jsx_runtime3.jsx)(Note, { children: 'This page has no Blocks yet. List some under "blocks" in the page and save.' });
68367
+ return (0, import_jsx_runtime4.jsx)(Note, { children: 'This page has no Blocks yet. List some under "blocks" in the page and save.' });
67978
68368
  }
67979
68369
  return instances.map((instance, index) => {
67980
68370
  const result = renderBlock(instance);
67981
- return (0, import_jsx_runtime3.jsx)(import_react2.default.Fragment, { children: result.success ? result.element : (0, import_jsx_runtime3.jsx)(Note, { children: result.error }) }, index);
68371
+ return (0, import_jsx_runtime4.jsx)(import_react2.default.Fragment, { children: result.success ? result.element : (0, import_jsx_runtime4.jsx)(Note, { children: result.error }) }, index);
67982
68372
  });
67983
68373
  }
67984
68374
  function Board({ board }) {
67985
68375
  const columns = rows(board.columns);
67986
- const nameOf = (id) => text(columns.find((column) => column.id === id)?.name) || text(id);
68376
+ const nameOf = (id) => text2(columns.find((column) => column.id === id)?.name) || text2(id);
67987
68377
  const transitions = rows(board.transitions);
67988
- return (0, import_jsx_runtime3.jsxs)("section", { className: "flex flex-col gap-3", children: [(0, import_jsx_runtime3.jsxs)("div", { children: [(0, import_jsx_runtime3.jsx)("h2", { className: "text-xl font-semibold", children: text(board.name) || text(board.id) }), text(board.description) && (0, import_jsx_runtime3.jsx)("p", { className: "text-sm text-muted-foreground", children: text(board.description) })] }), (0, import_jsx_runtime3.jsx)("div", { className: "flex flex-wrap gap-3", children: columns.map((column, index) => (0, import_jsx_runtime3.jsxs)("div", { className: "flex min-h-32 min-w-40 flex-1 flex-col gap-1 rounded-lg border border-border p-3", children: [(0, import_jsx_runtime3.jsx)("h3", { className: "text-sm font-semibold", children: text(column.name) || text(column.id) }), typeof column.wipLimit === "number" && (0, import_jsx_runtime3.jsxs)("p", { className: "text-xs text-muted-foreground", children: ["Limit: ", column.wipLimit] })] }, index)) }), (0, import_jsx_runtime3.jsx)("p", { className: "text-sm text-muted-foreground", children: transitions.length === 0 ? "Tasks can move between any columns." : `Moves: ${transitions.map((t) => `${nameOf(t.from)} \u2192 ${nameOf(t.to)}`).join(", ")}` })] });
68378
+ return (0, import_jsx_runtime4.jsxs)("section", { className: "flex flex-col gap-3", children: [(0, import_jsx_runtime4.jsxs)("div", { children: [(0, import_jsx_runtime4.jsx)("h2", { className: "text-xl font-semibold", children: text2(board.name) || text2(board.id) }), text2(board.description) && (0, import_jsx_runtime4.jsx)("p", { className: "text-sm text-muted-foreground", children: text2(board.description) })] }), (0, import_jsx_runtime4.jsx)("div", { className: "flex flex-wrap gap-3", children: columns.map((column, index) => (0, import_jsx_runtime4.jsxs)("div", { className: "flex min-h-32 min-w-40 flex-1 flex-col gap-1 rounded-lg border border-border p-3", children: [(0, import_jsx_runtime4.jsx)("h3", { className: "text-sm font-semibold", children: text2(column.name) || text2(column.id) }), typeof column.wipLimit === "number" && (0, import_jsx_runtime4.jsxs)("p", { className: "text-xs text-muted-foreground", children: ["Limit: ", column.wipLimit] })] }, index)) }), (0, import_jsx_runtime4.jsx)("p", { className: "text-sm text-muted-foreground", children: transitions.length === 0 ? "Tasks can move between any columns." : `Moves: ${transitions.map((t) => `${nameOf(t.from)} \u2192 ${nameOf(t.to)}`).join(", ")}` })] });
67989
68379
  }
67990
68380
  function CircuitPreview({ manifest }) {
67991
68381
  const boards = rows(manifest.boards);
67992
- return (0, import_jsx_runtime3.jsxs)(Card, { title: text(manifest.name) || text(manifest.id), summary: text(manifest.summary), label: "Circuit", children: [boards.length === 0 ? (0, import_jsx_runtime3.jsx)(Note, { children: "This Circuit has no boards yet. Add one to boards/main.json." }) : boards.map((board, index) => (0, import_jsx_runtime3.jsx)(Board, { board }, index)), (0, import_jsx_runtime3.jsx)(ListSection, { title: "Kits", items: rows(manifest.kits).map((kit) => `${text(kit.kitId)} ${text(kit.version)}`) }), (0, import_jsx_runtime3.jsx)(ListSection, { title: "Capabilities", items: rows(manifest.capabilities).map((c2) => `${text(c2.blockId)} ${text(c2.version)}`) })] });
68382
+ return (0, import_jsx_runtime4.jsxs)(Card, { title: text2(manifest.name) || text2(manifest.id), summary: text2(manifest.summary), label: "Circuit", children: [boards.length === 0 ? (0, import_jsx_runtime4.jsx)(Note, { children: "This Circuit has no boards yet. Add one to boards/main.json." }) : boards.map((board, index) => (0, import_jsx_runtime4.jsx)(Board, { board }, index)), (0, import_jsx_runtime4.jsx)(ListSection, { title: "Kits", items: rows(manifest.kits).map((kit) => `${text2(kit.kitId)} ${text2(kit.version)}`) }), (0, import_jsx_runtime4.jsx)(ListSection, { title: "Capabilities", items: rows(manifest.capabilities).map((c2) => `${text2(c2.blockId)} ${text2(c2.version)}`) })] });
67993
68383
  }
67994
68384
  function ManifestPreview({ manifest, page }) {
67995
68385
  const kind = manifestKind(manifest);
67996
68386
  const m = manifest;
67997
68387
  const style = kind === "kit" ? kitPageStyle(manifest) : void 0;
67998
- return (0, import_jsx_runtime3.jsxs)("div", { className: "blkc-page", style, children: [kind === "block" && (0, import_jsx_runtime3.jsx)(BlockPreview, { manifest: m }), kind === "kit" && (0, import_jsx_runtime3.jsx)(KitPreview, { manifest: m, page }), kind === "circuit" && (0, import_jsx_runtime3.jsx)(CircuitPreview, { manifest: m }), kind === null && (0, import_jsx_runtime3.jsx)(Note, { children: "This is not a Block, Kit or Circuit manifest." })] });
68388
+ return (0, import_jsx_runtime4.jsxs)("div", { className: "blkc-page", style, children: [kind === "block" && (0, import_jsx_runtime4.jsx)(BlockPreview, { manifest: m }), kind === "kit" && (0, import_jsx_runtime4.jsx)(KitPreview, { manifest: m, page }), kind === "circuit" && (0, import_jsx_runtime4.jsx)(CircuitPreview, { manifest: m }), kind === null && (0, import_jsx_runtime4.jsx)(Note, { children: "This is not a Block, Kit or Circuit manifest." })] });
67999
68389
  }
68000
68390
 
68001
68391
  // ../render-web/dist/index.js
68002
68392
  var HERO_TONE_CLASSES = {
68003
- default: "bg-background text-foreground",
68393
+ default: "bg-background text-foreground bg-[radial-gradient(60rem_30rem_at_50%_-10%,color-mix(in_srgb,var(--blkc-color-primary,#0066cc)_16%,transparent),transparent)]",
68004
68394
  muted: "bg-muted text-foreground",
68005
68395
  accent: "bg-accent text-accent-foreground",
68006
68396
  inverse: "bg-foreground text-background"
@@ -68035,21 +68425,21 @@ function HeroBlock({ props: p2, className, style }) {
68035
68425
  const ctaJustify = alignment === "center" ? "justify-center" : alignment === "right" ? "justify-end" : "justify-start";
68036
68426
  const toneClass = HERO_TONE_CLASSES[tone] ?? HERO_TONE_CLASSES.default;
68037
68427
  const scale = HERO_SIZE_CLASSES[size] ?? HERO_SIZE_CLASSES.md;
68038
- const ctaClass = (variant = "primary") => clsx("inline-flex items-center justify-center gap-2 rounded-md px-6 py-3 text-base font-semibold transition-colors", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", variant === "secondary" ? "bg-secondary text-secondary-foreground hover:bg-secondary/80" : variant === "outline" ? "border border-input bg-background text-foreground hover:bg-accent hover:text-accent-foreground" : "bg-primary text-primary-foreground hover:bg-primary/90");
68039
- return (0, import_jsx_runtime4.jsxs)("section", { className: clsx("blkc-hero relative flex w-full flex-col justify-center px-4", scale.section, toneClass, alignClass, className), style: {
68428
+ const ctaClass = (variant = "primary") => clsx("inline-flex items-center justify-center gap-2 rounded-lg px-6 py-3 text-base font-semibold no-underline shadow-sm transition-all hover:-translate-y-0.5 hover:shadow-md", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", variant === "secondary" ? "bg-secondary text-secondary-foreground hover:bg-secondary/80" : variant === "outline" ? "border border-border bg-background text-foreground hover:bg-muted" : "bg-primary text-primary-foreground hover:bg-primary/90");
68429
+ return (0, import_jsx_runtime5.jsxs)("section", { className: clsx("blkc-hero relative flex w-full flex-col justify-center px-6", scale.section, toneClass, alignClass, className), style: {
68040
68430
  padding,
68041
68431
  minHeight,
68042
68432
  backgroundColor: backgroundColor || void 0,
68043
68433
  color: textColor || void 0,
68044
68434
  ...style
68045
- }, children: [image && (0, import_jsx_runtime4.jsx)("div", { className: "w-full max-w-5xl", children: (0, import_jsx_runtime4.jsx)("img", { src: image.src, alt: image.alt || heading, className: "h-auto w-full rounded-lg object-cover" }) }), (0, import_jsx_runtime4.jsxs)("div", { className: clsx("flex w-full max-w-3xl flex-col", scale.gap), children: [eyebrow && (0, import_jsx_runtime4.jsx)("p", { className: clsx("font-medium uppercase tracking-wide", scale.eyebrow), children: eyebrow }), (0, import_jsx_runtime4.jsx)("h1", { className: clsx("font-bold leading-tight tracking-tight", scale.heading), children: heading }), subheading && (0, import_jsx_runtime4.jsx)("p", { className: clsx("text-muted-foreground", scale.subheading), children: subheading }), (cta || secondaryCta) && (0, import_jsx_runtime4.jsxs)("div", { className: clsx("flex flex-wrap items-center gap-3", ctaJustify), children: [cta && (0, import_jsx_runtime4.jsx)("a", { href: normalizeUrl(cta.href), className: ctaClass(cta.variant), target: cta.target || "_self", rel: cta.target === "_blank" ? "noopener noreferrer" : void 0, children: cta.label }), secondaryCta && (0, import_jsx_runtime4.jsx)("a", { href: normalizeUrl(secondaryCta.href), className: ctaClass(secondaryCta.variant ?? "outline"), target: secondaryCta.target || "_self", rel: secondaryCta.target === "_blank" ? "noopener noreferrer" : void 0, children: secondaryCta.label })] })] })] });
68435
+ }, children: [image && (0, import_jsx_runtime5.jsx)("div", { className: "w-full max-w-5xl", children: (0, import_jsx_runtime5.jsx)("img", { src: image.src, alt: image.alt || heading, className: "h-auto w-full rounded-lg object-cover" }) }), (0, import_jsx_runtime5.jsxs)("div", { className: clsx("flex w-full max-w-3xl flex-col", scale.gap), children: [eyebrow && (0, import_jsx_runtime5.jsx)("p", { className: clsx("w-fit rounded-full border border-border bg-muted px-3 py-1 font-semibold uppercase tracking-wide", alignment === "center" && "mx-auto", alignment === "right" && "ml-auto", scale.eyebrow), children: eyebrow }), (0, import_jsx_runtime5.jsx)("h1", { className: clsx("blkc-heading font-bold leading-[1.1] tracking-tight text-balance", scale.heading), children: heading }), subheading && (0, import_jsx_runtime5.jsx)("p", { className: clsx("text-muted-foreground text-pretty", scale.subheading), children: subheading }), (cta || secondaryCta) && (0, import_jsx_runtime5.jsxs)("div", { className: clsx("flex flex-wrap items-center gap-3", ctaJustify), children: [cta && (0, import_jsx_runtime5.jsx)("a", { href: normalizeUrl(cta.href), className: ctaClass(cta.variant), target: cta.target || "_self", rel: cta.target === "_blank" ? "noopener noreferrer" : void 0, children: cta.label }), secondaryCta && (0, import_jsx_runtime5.jsx)("a", { href: normalizeUrl(secondaryCta.href), className: ctaClass(secondaryCta.variant ?? "outline"), target: secondaryCta.target || "_self", rel: secondaryCta.target === "_blank" ? "noopener noreferrer" : void 0, children: secondaryCta.label })] })] })] });
68046
68436
  }
68047
68437
  function TextBlock({ props: p2, className, style }) {
68048
68438
  const { content, tag = "p", color, backgroundColor, fontSize, fontWeight, textAlign, margin, padding } = p2;
68049
68439
  const alignClass = textAlign === "left" ? "text-left" : textAlign === "right" ? "text-right" : textAlign === "center" ? "text-center" : void 0;
68050
68440
  const safeTag = ["p", "div", "span", "h1", "h2", "h3", "h4", "h5", "h6"].includes(tag) ? tag : "div";
68051
68441
  const SafeTag = safeTag;
68052
- return (0, import_jsx_runtime4.jsx)(SafeTag, { className: clsx("blkc-text leading-relaxed", alignClass, className), style: {
68442
+ return (0, import_jsx_runtime5.jsx)(SafeTag, { className: clsx("blkc-text mx-auto w-full max-w-3xl px-6 py-8 text-lg leading-relaxed text-pretty [&_a]:font-medium [&_a]:text-primary [&_a]:underline [&_a]:underline-offset-4 [&_p+p]:mt-4", alignClass, className), style: {
68053
68443
  margin,
68054
68444
  padding,
68055
68445
  color: color || void 0,
@@ -68064,35 +68454,35 @@ function ImageBlock({ props: p2, className, style }) {
68064
68454
  const { src, alt, width, height, objectFit = "cover", borderRadius, caption, link, alignment = "center" } = p2;
68065
68455
  const alignClass = alignment === "left" ? "mr-auto" : alignment === "right" ? "ml-auto" : "mx-auto";
68066
68456
  const imageUrl = normalizeUrl(src);
68067
- const imageElement = (0, import_jsx_runtime4.jsx)("img", { src: imageUrl, alt, className: "blkc-image-img block h-auto max-w-full", style: {
68457
+ const imageElement = (0, import_jsx_runtime5.jsx)("img", { src: imageUrl, alt, className: "blkc-image-img block h-auto max-w-full rounded-xl border border-border shadow-md", style: {
68068
68458
  width: width || "100%",
68069
68459
  height: height || "auto",
68070
68460
  objectFit,
68071
68461
  borderRadius: borderRadius || void 0,
68072
68462
  ...style
68073
68463
  } });
68074
- const content = link ? (0, import_jsx_runtime4.jsx)("a", { href: normalizeUrl(link), className: "blkc-image-link inline-block", target: "_blank", rel: "noopener noreferrer", children: imageElement }) : imageElement;
68075
- return (0, import_jsx_runtime4.jsxs)("figure", { className: clsx("blkc-image flex w-full flex-col gap-2", alignClass, className), children: [(0, import_jsx_runtime4.jsx)("div", { className: "blkc-image-wrapper w-full", children: content }), caption && (0, import_jsx_runtime4.jsx)("figcaption", { className: "blkc-image-caption text-sm text-muted-foreground", children: caption })] });
68464
+ const content = link ? (0, import_jsx_runtime5.jsx)("a", { href: normalizeUrl(link), className: "blkc-image-link inline-block", target: "_blank", rel: "noopener noreferrer", children: imageElement }) : imageElement;
68465
+ return (0, import_jsx_runtime5.jsxs)("figure", { className: clsx("blkc-image flex w-full max-w-5xl flex-col gap-3 px-6 py-8", alignClass, className), children: [(0, import_jsx_runtime5.jsx)("div", { className: "blkc-image-wrapper w-full", children: content }), caption && (0, import_jsx_runtime5.jsx)("figcaption", { className: "blkc-image-caption text-center text-sm text-muted-foreground", children: caption })] });
68076
68466
  }
68077
68467
  function ButtonBlock({ props: p2, className, style }) {
68078
68468
  const { label, href, variant = "primary", size = "md", alignment = "center", target = "_self", icon, iconPosition = "left" } = p2;
68079
68469
  const hrefUrl = normalizeUrl(href);
68080
68470
  const isExternal = isExternalUrl(hrefUrl);
68081
- const sizeClass = size === "sm" ? "px-3 py-1.5 text-sm" : size === "lg" ? "px-6 py-3 text-lg" : "px-4 py-2 text-base";
68082
- const variantClass = variant === "secondary" ? "bg-secondary text-secondary-foreground hover:bg-secondary/80" : variant === "outline" ? "border border-input bg-background hover:bg-accent hover:text-accent-foreground" : variant === "ghost" ? "hover:bg-accent hover:text-accent-foreground" : variant === "link" ? "text-primary underline-offset-4 hover:underline" : "bg-primary text-primary-foreground hover:bg-primary/90";
68083
- return (0, import_jsx_runtime4.jsx)("div", { className: clsx("flex", alignment === "left" ? "justify-start" : alignment === "right" ? "justify-end" : "justify-center"), children: (0, import_jsx_runtime4.jsxs)("a", { href: hrefUrl || "#", className: clsx("blkc-button inline-flex items-center justify-center gap-2 rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50", sizeClass, variantClass, className), style, target, rel: isExternal ? "noopener noreferrer" : void 0, children: [icon && iconPosition === "left" && (0, import_jsx_runtime4.jsx)("span", { className: "blkc-button-icon blkc-button-icon-left", children: icon }), (0, import_jsx_runtime4.jsx)("span", { className: "blkc-button-label", children: label }), icon && iconPosition === "right" && (0, import_jsx_runtime4.jsx)("span", { className: "blkc-button-icon blkc-button-icon-right", children: icon })] }) });
68471
+ const sizeClass = size === "sm" ? "px-3 py-1.5 text-sm" : size === "lg" ? "px-7 py-3.5 text-lg" : "px-5 py-2.5 text-base";
68472
+ const variantClass = variant === "secondary" ? "bg-secondary text-secondary-foreground hover:bg-secondary/80" : variant === "outline" ? "border border-border bg-background text-foreground hover:bg-muted" : variant === "ghost" ? "text-foreground hover:bg-muted" : variant === "link" ? "text-primary underline-offset-4 hover:underline" : "bg-primary text-primary-foreground hover:bg-primary/90";
68473
+ return (0, import_jsx_runtime5.jsx)("div", { className: clsx("flex px-6 py-4", alignment === "left" ? "justify-start" : alignment === "right" ? "justify-end" : "justify-center"), children: (0, import_jsx_runtime5.jsxs)("a", { href: hrefUrl || "#", className: clsx("blkc-button inline-flex items-center justify-center gap-2 rounded-lg font-semibold no-underline shadow-sm transition-all hover:-translate-y-0.5 hover:shadow-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50", sizeClass, variantClass, className), style, target, rel: isExternal ? "noopener noreferrer" : void 0, children: [icon && iconPosition === "left" && (0, import_jsx_runtime5.jsx)("span", { className: "blkc-button-icon blkc-button-icon-left", children: icon }), (0, import_jsx_runtime5.jsx)("span", { className: "blkc-button-label", children: label }), icon && iconPosition === "right" && (0, import_jsx_runtime5.jsx)("span", { className: "blkc-button-icon blkc-button-icon-right", children: icon })] }) });
68084
68474
  }
68085
68475
  function SectionBlock({ props: p2, className, style, children }) {
68086
68476
  const { backgroundColor, textColor, padding, margin, minHeight, alignment = "center" } = p2;
68087
68477
  const widthClass = alignment === "wide" ? "w-full max-w-blkc" : alignment === "full" ? "w-full" : "w-full";
68088
- return (0, import_jsx_runtime4.jsx)("section", { className: clsx("blkc-section text-foreground", widthClass, alignment === "wide" && "mx-auto", className), style: {
68478
+ return (0, import_jsx_runtime5.jsx)("section", { className: clsx("blkc-section text-foreground", !padding && "px-6 py-16", widthClass, alignment === "wide" && "mx-auto", className), style: {
68089
68479
  padding,
68090
68480
  margin,
68091
68481
  minHeight,
68092
68482
  backgroundColor: backgroundColor || void 0,
68093
68483
  color: textColor || void 0,
68094
68484
  ...style
68095
- }, children: (0, import_jsx_runtime4.jsx)("div", { className: "blkc-section-content mx-auto flex w-full max-w-blkc flex-col gap-6", children }) });
68485
+ }, children: (0, import_jsx_runtime5.jsxs)("div", { className: "blkc-section-content mx-auto flex w-full max-w-blkc flex-col gap-6", children: [p2.heading && (0, import_jsx_runtime5.jsx)("h2", { className: "blkc-heading text-3xl font-bold tracking-tight text-balance sm:text-4xl", children: p2.heading }), p2.content && (0, import_jsx_runtime5.jsx)("div", { className: "max-w-3xl text-lg leading-relaxed text-muted-foreground", dangerouslySetInnerHTML: { __html: richTextToHtml(p2.content) } }), children] }) });
68096
68486
  }
68097
68487
  var defaultRegistry = /* @__PURE__ */ new Map();
68098
68488
  function registerBlock(blockId, component, manifest) {
@@ -68123,6 +68513,7 @@ registerBlock("story", StoryBlock);
68123
68513
  registerBlock("values", ValuesBlock);
68124
68514
  registerBlock("cta", CtaBlock);
68125
68515
  registerBlock("contact", ContactBlock);
68516
+ registerBlock("office", OfficeBlock);
68126
68517
  function renderBlock(instance, options = {}) {
68127
68518
  const { block: blockId, props = {} } = instance;
68128
68519
  const { wrapperClassName, wrapperComponent: Wrapper, passThroughClassName = true, theme } = options;
@@ -68138,8 +68529,8 @@ function renderBlock(instance, options = {}) {
68138
68529
  const { component: Component } = entry;
68139
68530
  const themeStyle = theme && Object.keys(theme).length > 0 ? theme : void 0;
68140
68531
  try {
68141
- const rendered = Wrapper ? (0, import_jsx_runtime4.jsx)(Wrapper, { className: wrapperClassName, children: (0, import_jsx_runtime4.jsx)(Component, { props, className: passThroughClassName ? wrapperClassName : void 0 }) }) : (0, import_jsx_runtime4.jsx)("div", { className: wrapperClassName, children: (0, import_jsx_runtime4.jsx)(Component, { props, className: passThroughClassName ? wrapperClassName : void 0 }) });
68142
- const element = themeStyle ? (0, import_jsx_runtime4.jsx)("div", { style: themeStyle, children: rendered }) : rendered;
68532
+ const rendered = Wrapper ? (0, import_jsx_runtime5.jsx)(Wrapper, { className: wrapperClassName, children: (0, import_jsx_runtime5.jsx)(Component, { props, className: passThroughClassName ? wrapperClassName : void 0 }) }) : (0, import_jsx_runtime5.jsx)("div", { className: wrapperClassName, children: (0, import_jsx_runtime5.jsx)(Component, { props, className: passThroughClassName ? wrapperClassName : void 0 }) });
68533
+ const element = themeStyle ? (0, import_jsx_runtime5.jsx)("div", { style: themeStyle, children: rendered }) : rendered;
68143
68534
  return {
68144
68535
  element,
68145
68536
  blockId,
@@ -68169,7 +68560,7 @@ function renderBlocks(instances, options = {}) {
68169
68560
  }
68170
68561
  function renderPage(instances, options = {}) {
68171
68562
  const { elements } = renderBlocks(instances, options);
68172
- return (0, import_jsx_runtime4.jsx)("div", { className: "blkc-page", children: elements.map((element, index) => (0, import_jsx_runtime4.jsx)(import_react3.default.Fragment, { children: element }, index)) });
68563
+ return (0, import_jsx_runtime5.jsx)("div", { className: "blkc-page", children: elements.map((element, index) => (0, import_jsx_runtime5.jsx)(import_react3.default.Fragment, { children: element }, index)) });
68173
68564
  }
68174
68565
  function getGlobalCSS(theme = DEFAULT_THEME) {
68175
68566
  const mergedTheme = mergeTheme(theme);
@@ -68213,42 +68604,51 @@ ${themeToCss(mergedTheme)}
68213
68604
  }
68214
68605
 
68215
68606
  // ../render-web/dist/server.js
68216
- var import_jsx_runtime5 = __toESM(require_jsx_runtime(), 1);
68607
+ var import_jsx_runtime6 = __toESM(require_jsx_runtime(), 1);
68217
68608
  var import_react4 = __toESM(require_react(), 1);
68218
68609
  var import_server = __toESM(require_server_node(), 1);
68219
68610
  function renderManifestToHTML(manifest, options = {}) {
68220
- return (0, import_server.renderToStaticMarkup)((0, import_jsx_runtime5.jsx)(ManifestPreview, { manifest, page: options.page }));
68611
+ return (0, import_server.renderToStaticMarkup)((0, import_jsx_runtime6.jsx)(ManifestPreview, { manifest, page: options.page }));
68221
68612
  }
68222
68613
  function escapeHtml2(value) {
68223
68614
  return value.replace(/[&<>"']/g, (c2) => `&#${c2.charCodeAt(0)};`).replace(/&#38;/g, "&amp;");
68224
68615
  }
68225
- function themeFontLink(manifest) {
68616
+ function themeFontLinks(manifest) {
68226
68617
  const theme = manifest?.theme;
68227
- const family = theme?.settings?.typography?.fontFamilies?.[0]?.fontFamily;
68228
- const name = typeof family === "string" ? /^\s*['"]([^'"]+)['"]/.exec(family)?.[1] : void 0;
68229
- if (!name)
68230
- return "";
68231
- return `<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=${escapeHtml2(encodeURIComponent(name))}&amp;display=swap">`;
68618
+ return (theme?.settings?.typography?.fontFamilies ?? []).slice(0, 2).map(({ fontFamily }) => {
68619
+ const name = typeof fontFamily === "string" ? /^\s*['"]([^'"]+)['"]/.exec(fontFamily)?.[1] : void 0;
68620
+ return name ? `<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=${escapeHtml2(encodeURIComponent(name))}&amp;display=swap">` : "";
68621
+ }).join("");
68622
+ }
68623
+ function previewPolicy(nonce) {
68624
+ return `<meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'nonce-${nonce}'; style-src 'unsafe-inline' https://fonts.googleapis.com; font-src https://fonts.gstatic.com; img-src * data:; base-uri 'self'">`;
68232
68625
  }
68233
68626
  function renderManifestDocument(manifest, options = {}) {
68234
68627
  const name = manifest?.name;
68235
68628
  const title3 = typeof name === "string" ? name : "BLKC preview";
68629
+ const body = renderManifestToHTML(manifest, options);
68630
+ const nonce = options.nonce ? ` nonce="${escapeHtml2(options.nonce)}"` : "";
68631
+ const runtime = options.canvasRuntime && body.includes("data-blkc-canvas=") ? `<script${nonce}>${options.canvasRuntime.replace(/<\/script/gi, "<\\/script")}</script>` : "";
68236
68632
  return `<!doctype html>
68237
68633
  <html lang="${escapeHtml2(options.lang ?? "en")}">
68238
68634
  <head>
68239
68635
  <meta charset="utf-8">
68636
+ ${options.nonce ? previewPolicy(escapeHtml2(options.nonce)) : ""}
68240
68637
  <meta name="viewport" content="width=device-width, initial-scale=1">
68241
68638
  <title>${escapeHtml2(title3)}</title>
68242
- ${themeFontLink(manifest)}
68639
+ ${themeFontLinks(manifest)}
68243
68640
  ${options.head ?? ""}
68244
68641
  </head>
68245
- <body style="margin:0">${renderManifestToHTML(manifest, options)}</body>
68642
+ <body style="margin:0">${body}${runtime}</body>
68246
68643
  </html>
68247
68644
  `;
68248
68645
  }
68249
68646
 
68250
68647
  // ../render-web/dist/styles.css
68251
- var styles_default = '/*! tailwindcss v4.3.4 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:block))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-outline-style:solid;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-500:oklch(63.7% .237 25.331);--color-white:#fff;--spacing:.25rem;--container-2xl:42rem;--container-3xl:48rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--leading-tight:1.25;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.relative{position:relative}.static{position:static}.mx-auto{margin-inline:auto}.my-6{margin-block:calc(var(--spacing) * 6)}.mt-auto{margin-top:auto}.mr-auto{margin-right:auto}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-auto{height:auto}.min-h-32{min-height:calc(var(--spacing) * 32)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-blkc{max-width:var(--blkc-max-width,1200px)}.max-w-full{max-width:100%}.min-w-40{min-width:calc(var(--spacing) * 40)}.flex-1{flex:1}.list-none{list-style-type:none}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-1{gap:var(--spacing)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-10{gap:calc(var(--spacing) * 10)}.overflow-x-auto{overflow-x:auto}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-border,.border-input{border-color:var(--blkc-color-border,#e0e0e0)}.bg-accent{background-color:var(--blkc-color-primary,#06c)}.bg-background{background-color:var(--blkc-color-background,#fff)}.bg-foreground{background-color:var(--blkc-color-text,#1a1a1a)}.bg-muted{background-color:var(--blkc-color-background,#fff)}.bg-primary{background-color:var(--blkc-color-primary,#06c)}.bg-red-500{background-color:var(--color-red-500)}.bg-secondary{background-color:var(--blkc-color-secondary,#6c757d)}.object-cover{object-fit:cover}.p-0{padding:0}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-1\\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-24{padding-block:calc(var(--spacing) * 24)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-accent-foreground,.text-background{color:var(--blkc-color-background,#fff)}.text-foreground{color:var(--blkc-color-text,#1a1a1a)}.text-muted-foreground{color:var(--blkc-color-text-secondary,#6c757d)}.text-primary{color:var(--blkc-color-primary,#06c)}.text-primary-foreground,.text-secondary-foreground{color:var(--blkc-color-background,#fff)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}@media (hover:hover){.hover\\:bg-accent:hover,.hover\\:bg-primary\\/90:hover{background-color:var(--blkc-color-primary,#06c)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab, var(--blkc-color-primary,#06c) 90%, transparent)}}.hover\\:bg-secondary\\/80:hover{background-color:var(--blkc-color-secondary,#6c757d)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-secondary\\/80:hover{background-color:color-mix(in oklab, var(--blkc-color-secondary,#6c757d) 80%, transparent)}}.hover\\:text-accent-foreground:hover{color:var(--blkc-color-background,#fff)}.hover\\:underline:hover{text-decoration-line:underline}}.focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset, ) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\\:ring-ring:focus-visible{--tw-ring-color:var(--blkc-color-primary,#06c)}.focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\\:pointer-events-none:disabled{pointer-events:none}.disabled\\:opacity-50:disabled{opacity:.5}@media (min-width:40rem){.sm\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\\:py-20{padding-block:calc(var(--spacing) * 20)}.sm\\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.sm\\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.sm\\:text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.sm\\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.sm\\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}@media (min-width:48rem){.md\\:order-2{order:2}.md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:64rem){.lg\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}}.blkc-page{background-color:var(--blkc-color-background,#fff);min-height:100vh;color:var(--blkc-color-text,#1a1a1a);font-family:var(--blkc-font-family,system-ui, sans-serif)}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}';
68648
+ var styles_default = '/*! tailwindcss v4.3.4 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:block))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-500:oklch(63.7% .237 25.331);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-500:oklch(76.9% .188 70.08);--color-yellow-400:oklch(85.2% .199 91.936);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-violet-500:oklch(60.6% .25 292.717);--color-zinc-400:oklch(70.5% .015 286.067);--color-white:#fff;--spacing:.25rem;--container-2xl:42rem;--container-3xl:48rem;--container-5xl:64rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wide:.025em;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.relative{position:relative}.static{position:static}.m-0{margin:0}.mx-auto{margin-inline:auto}.my-6{margin-block:calc(var(--spacing) * 6)}.mt-1{margin-top:var(--spacing)}.mt-1\\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-auto{margin-top:auto}.mr-auto{margin-right:auto}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.aspect-\\[26\\/17\\]{aspect-ratio:26/17}.size-2\\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.h-2{height:calc(var(--spacing) * 2)}.h-auto{height:auto}.h-full{height:100%}.min-h-32{min-height:calc(var(--spacing) * 32)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-blkc{max-width:var(--blkc-max-width,1200px)}.max-w-full{max-width:100%}.min-w-0{min-width:0}.min-w-40{min-width:calc(var(--spacing) * 40)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.cursor-pointer{cursor:pointer}.touch-manipulation{touch-action:manipulation}.list-none{list-style-type:none}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-1{gap:var(--spacing)}.gap-1\\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-10{gap:calc(var(--spacing) * 10)}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-border{border-color:var(--blkc-color-border,var(--blkc-color-text,#1a1a1a))}@supports (color:color-mix(in lab, red, red)){.border-border{border-color:var(--blkc-color-border,color-mix(in srgb, var(--blkc-color-text,#1a1a1a) 16%, var(--blkc-color-background,#fff)))}}.bg-accent{background-color:var(--blkc-color-accent,var(--blkc-color-primary,#06c))}.bg-accent-foreground{background-color:var(--blkc-color-background,#fff)}.bg-amber-300{background-color:var(--color-amber-300)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-background{background-color:var(--blkc-color-background,#fff)}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-foreground{background-color:var(--blkc-color-text,#1a1a1a)}.bg-muted{background-color:var(--blkc-color-surface,var(--blkc-color-text,#1a1a1a))}@supports (color:color-mix(in lab, red, red)){.bg-muted{background-color:var(--blkc-color-surface,color-mix(in srgb, var(--blkc-color-text,#1a1a1a) 6%, var(--blkc-color-background,#fff)))}}.bg-primary{background-color:var(--blkc-color-primary,#06c)}.bg-red-500{background-color:var(--color-red-500)}.bg-secondary{background-color:var(--blkc-color-secondary,#6c757d)}.bg-sky-400{background-color:var(--color-sky-400)}.bg-sky-500{background-color:var(--color-sky-500)}.bg-violet-500{background-color:var(--color-violet-500)}.bg-yellow-400{background-color:var(--color-yellow-400)}.bg-zinc-400{background-color:var(--color-zinc-400)}.bg-\\[radial-gradient\\(60rem_30rem_at_50\\%_-10\\%\\,color-mix\\(in_srgb\\,var\\(--blkc-color-primary\\,\\#0066cc\\)_16\\%\\,transparent\\)\\,transparent\\)\\]{background-image:radial-gradient(60rem 30rem at 50% -10%,var(--blkc-color-primary,#06c),transparent)}@supports (color:color-mix(in lab, red, red)){.bg-\\[radial-gradient\\(60rem_30rem_at_50\\%_-10\\%\\,color-mix\\(in_srgb\\,var\\(--blkc-color-primary\\,\\#0066cc\\)_16\\%\\,transparent\\)\\,transparent\\)\\]{background-image:radial-gradient(60rem 30rem at 50% -10%,color-mix(in srgb,var(--blkc-color-primary,#06c) 16%,transparent),transparent)}}.object-cover{object-fit:cover}.p-0{padding:0}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-7{padding-inline:calc(var(--spacing) * 7)}.py-1{padding-block:var(--spacing)}.py-1\\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-14{padding-block:calc(var(--spacing) * 14)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-24{padding-block:calc(var(--spacing) * 24)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-\\[1\\.1\\]{--tw-leading:1.1;line-height:1.1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-balance{text-wrap:balance}.text-pretty{text-wrap:pretty}.text-accent{color:var(--blkc-color-accent,var(--blkc-color-primary,#06c))}.text-accent-foreground,.text-background{color:var(--blkc-color-background,#fff)}.text-foreground{color:var(--blkc-color-text,#1a1a1a)}.text-inherit{color:inherit}.text-muted-foreground{color:var(--blkc-color-text-secondary,#6c757d)}.text-primary{color:var(--blkc-color-primary,#06c)}.text-primary-foreground,.text-secondary-foreground{color:var(--blkc-color-background,#fff)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.\\[image-rendering\\:pixelated\\]{image-rendering:pixelated}@media (hover:hover){.hover\\:-translate-y-0\\.5:hover{--tw-translate-y:calc(var(--spacing) * -.5);translate:var(--tw-translate-x) var(--tw-translate-y)}.hover\\:bg-muted:hover{background-color:var(--blkc-color-surface,var(--blkc-color-text,#1a1a1a))}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted:hover{background-color:var(--blkc-color-surface,color-mix(in srgb, var(--blkc-color-text,#1a1a1a) 6%, var(--blkc-color-background,#fff)))}}.hover\\:bg-primary\\/90:hover{background-color:var(--blkc-color-primary,#06c)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-primary\\/90:hover{background-color:color-mix(in oklab, var(--blkc-color-primary,#06c) 90%, transparent)}}.hover\\:bg-secondary\\/80:hover{background-color:var(--blkc-color-secondary,#6c757d)}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-secondary\\/80:hover{background-color:color-mix(in oklab, var(--blkc-color-secondary,#6c757d) 80%, transparent)}}.hover\\:underline:hover{text-decoration-line:underline}.hover\\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.hover\\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset, ) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\\:ring-ring:focus-visible{--tw-ring-color:var(--blkc-color-primary,#06c)}.focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\\:pointer-events-none:disabled{pointer-events:none}.disabled\\:cursor-default:disabled{cursor:default}.disabled\\:opacity-50:disabled{opacity:.5}.aria-pressed\\:border-primary[aria-pressed=true]{border-color:var(--blkc-color-primary,#06c)}.aria-pressed\\:bg-muted[aria-pressed=true]{background-color:var(--blkc-color-surface,var(--blkc-color-text,#1a1a1a))}@supports (color:color-mix(in lab, red, red)){.aria-pressed\\:bg-muted[aria-pressed=true]{background-color:var(--blkc-color-surface,color-mix(in srgb, var(--blkc-color-text,#1a1a1a) 6%, var(--blkc-color-background,#fff)))}}@media (min-width:40rem){.sm\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\\:py-20{padding-block:calc(var(--spacing) * 20)}.sm\\:py-24{padding-block:calc(var(--spacing) * 24)}.sm\\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.sm\\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.sm\\:text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.sm\\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.sm\\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}}@media (min-width:48rem){.md\\:order-2{order:2}.md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:64rem){.lg\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\\:grid-cols-\\[minmax\\(0\\,1fr\\)_20rem\\]{grid-template-columns:minmax(0,1fr) 20rem}}.\\[\\&_a\\]\\:font-medium a{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\\[\\&_a\\]\\:text-primary a{color:var(--blkc-color-primary,#06c)}.\\[\\&_a\\]\\:underline a{text-decoration-line:underline}.\\[\\&_a\\]\\:underline-offset-4 a{text-underline-offset:4px}.\\[\\&_p\\+p\\]\\:mt-4 p+p{margin-top:calc(var(--spacing) * 4)}.\\[\\&_strong\\]\\:text-foreground strong{color:var(--blkc-color-text,#1a1a1a)}.\\[\\&\\>\\*\\]\\:rounded-xl>*{border-radius:var(--radius-xl)}.\\[\\&\\>\\*\\]\\:border>*{border-style:var(--tw-border-style);border-width:1px}.\\[\\&\\>\\*\\]\\:border-border>*{border-color:var(--blkc-color-border,var(--blkc-color-text,#1a1a1a))}@supports (color:color-mix(in lab, red, red)){.\\[\\&\\>\\*\\]\\:border-border>*{border-color:var(--blkc-color-border,color-mix(in srgb, var(--blkc-color-text,#1a1a1a) 16%, var(--blkc-color-background,#fff)))}}.\\[\\&\\>\\*\\]\\:bg-muted>*{background-color:var(--blkc-color-surface,var(--blkc-color-text,#1a1a1a))}@supports (color:color-mix(in lab, red, red)){.\\[\\&\\>\\*\\]\\:bg-muted>*{background-color:var(--blkc-color-surface,color-mix(in srgb, var(--blkc-color-text,#1a1a1a) 6%, var(--blkc-color-background,#fff)))}}.\\[\\&\\>\\*\\]\\:p-6>*{padding:calc(var(--spacing) * 6)}.\\[\\&\\>\\*\\]\\:font-medium>*{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.\\[\\&\\>\\*\\]\\:shadow-sm>*{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}}.blkc-page{background-color:var(--blkc-color-background,#fff);min-height:100vh;color:var(--blkc-color-text,#1a1a1a);font-family:var(--blkc-font-family,system-ui, sans-serif)}.blkc-heading{font-family:var(--blkc-font-family-heading,inherit)}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}';
68649
+
68650
+ // ../render-canvas/dist/runtime.txt
68651
+ var runtime_default = '"use strict";(()=>{var E={desk:{w:3,h:2,spot:{x:1,y:2}},coffee:{w:2,h:1,spot:{x:0,y:1}},water:{w:1,h:1,spot:{x:0,y:1}},sofa:{w:3,h:1,spot:{x:1,y:1}},plant:{w:1,h:1},board:{w:4,h:1,spot:{x:1,y:1}},shelf:{w:2,h:1,spot:{x:0,y:1}},server:{w:1,h:1},table:{w:3,h:2,spot:{x:1,y:2}},rug:{w:4,h:3,solid:!1}},ct=["working","thinking","blocked","reviewing","idle","done","away"],ut=["todo","doing","done"],dt=["wood","carpet","tile"],C={cols:26,rows:17,rooms:[{id:"studio",name:"Studio",x:1,y:3,w:15,h:13,floor:"wood"},{id:"lounge",name:"Lounge",x:17,y:3,w:8,h:6,floor:"carpet"},{id:"quests",name:"Quests",x:17,y:10,w:8,h:6,floor:"tile"}],doors:[{x:16,y:6},{x:16,y:13},{x:23,y:9}],furniture:[{type:"desk",x:2,y:4},{type:"desk",x:7,y:4},{type:"desk",x:12,y:4},{type:"desk",x:2,y:10},{type:"desk",x:7,y:10},{type:"desk",x:12,y:10},{type:"plant",x:1,y:8},{type:"plant",x:15,y:8},{type:"server",x:15,y:15},{type:"server",x:14,y:15},{type:"shelf",x:1,y:15},{type:"coffee",x:19,y:3},{type:"water",x:21,y:3},{type:"sofa",x:22,y:3},{type:"rug",x:20,y:5},{type:"plant",x:24,y:8},{type:"board",x:19,y:10},{type:"table",x:19,y:13},{type:"plant",x:24,y:15}]},A=(t,e)=>typeof t=="number"&&Number.isFinite(t)?Math.floor(t):e,w=(t,e=120)=>typeof t=="string"?t.slice(0,e):"",S=(t,e)=>Array.isArray(t)?t.slice(0,e):[];function V(t){let e=2166136261;for(let n=0;n<t.length;n++)e=Math.imul(e^t.charCodeAt(n),16777619);return e>>>0}var Y=["#2b1b12","#5a3a22","#a8622d","#d9b36c","#20242e","#7d2f3f","#4a5568","#e5e7eb"],Q=["#f4d3b5","#e8b98f","#c98d62","#9c6644","#6f4530","#4e2f20"],J=["#3b82f6","#ef4444","#10b981","#f59e0b","#8b5cf6","#ec4899","#14b8a6","#f97316"],_=(t,e)=>typeof t=="string"&&/^#[0-9a-f]{3,8}$/i.test(t)?t:e,F=(t,e,n)=>n*t.cols+e;function R(t,e,n){return e>=0&&n>=0&&e<t.cols&&n<t.rows&&t.walkable[F(t,e,n)]===!0}function Z(t,e,n){if(!R(t,n.x,n.y))return null;if(e.x===n.x&&e.y===n.y)return[];let i=new Int32Array(t.cols*t.rows).fill(-1),r=F(t,e.x,e.y);i[r]=r;let s=[r];for(let o=0;o<s.length;o++){let a=s[o],u=a%t.cols,l=Math.floor(a/t.cols);if(u===n.x&&l===n.y){let h=[];for(let p=a;p!==r;p=i[p])h.unshift({x:p%t.cols,y:Math.floor(p/t.cols)});return h}for(let[h,p]of[[0,1],[0,-1],[1,0],[-1,0]]){let x=u+h,k=l+p;if(!R(t,x,k))continue;let M=F(t,x,k);i[M]===-1&&(i[M]=a,s.push(M))}}return null}function tt(t,e){let n=w(t?.id,60)||`agent-${e+1}`,i=V(n),r=ct.includes(t?.state)?t.state:"idle";return{id:n,name:w(t?.name,24)||n,role:w(t?.role,40),state:r,task:w(t?.task,120),hair:_(t?.hair,Y[i%Y.length]),skin:_(t?.skin,Q[(i>>>4)%Q.length]),shirt:_(t?.shirt,J[(i>>>8)%J.length]),x:0,y:0,path:[],facing:"down",walking:!1,rest:0,seed:i}}function et(t){return{title:w(t?.title,80),state:ut.includes(t?.state)?t.state:"todo",agent:w(t?.agent,60)}}function B(t={}){let e=Array.isArray(t?.rooms)&&t.rooms.length>0,n=Math.min(Math.max(A(t?.cols,e?20:C.cols),6),64),i=Math.min(Math.max(A(t?.rows,e?14:C.rows),6),40),r=e?S(t.rooms,40):C.rooms,s=e?S(t.doors,60):C.doors,o=Array.isArray(t?.furniture)?S(t.furniture,300):e?[]:C.furniture,a=r.map(c=>{let b=Math.min(Math.max(A(c?.x,0),0),n),y=Math.min(Math.max(A(c?.y,0),0),i);return{name:w(c?.name,24),x:b,y,w:Math.min(Math.max(A(c?.w,0),0),n-b),h:Math.min(Math.max(A(c?.h,0),0),i-y),floor:dt.includes(c?.floor)?c.floor:"wood"}}),u=new Array(n*i).fill(!1),l=(c,b,y)=>{c>=0&&b>=0&&c<n&&b<i&&(u[b*n+c]=y)};for(let c of a)for(let b=c.y;b<c.y+c.h;b++)for(let y=c.x;y<c.x+c.w;y++)l(y,b,!0);let h=s.map(c=>({x:A(c?.x,-1),y:A(c?.y,-1)})).filter(c=>c.x>=0&&c.y>=0);for(let c of h)l(c.x,c.y,!0);let p=o.filter(c=>c&&Object.hasOwn(E,c.type)).map(c=>({type:c.type,x:A(c.x,-99),y:A(c.y,-99)}));for(let c of p){let b=E[c.type];if(b.solid!==!1)for(let y=c.y;y<c.y+b.h;y++)for(let T=c.x;T<c.x+b.w;T++)l(T,y,!1)}let x={cols:n,rows:i,rooms:a,doors:h,furniture:p,walkable:u,agents:S(t?.agents,40).map(tt),tasks:S(t?.tasks,60).map(et),spots:{lounge:[],board:[]}},k=c=>{let b=E[c.type].spot;if(!b)return;let y={x:c.x+b.x,y:c.y+b.y};return R(x,y.x,y.y)?y:void 0},M=p.filter(c=>c.type==="desk").map(k).filter(c=>!!c);for(let c of p){let b=k(c);b&&((c.type==="coffee"||c.type==="sofa"||c.type==="water"||c.type==="shelf")&&x.spots.lounge.push(b),(c.type==="board"||c.type==="table")&&x.spots.board.push(b))}return x.agents.forEach((c,b)=>{c.seat=M[b],nt(x,c)}),x}function ht(t){for(let e=0;e<t.rows;e++)for(let n=0;n<t.cols;n++)if(R(t,n,e))return{x:n,y:e};return{x:0,y:0}}function I(t,e){let n=i=>i.length>0?i[(e.seed+Math.floor(e.rest*1e3))%i.length]:void 0;switch(e.state){case"working":case"thinking":case"blocked":return e.seat??n(t.spots.lounge);case"reviewing":return n(t.spots.board)??e.seat;case"idle":case"done":return n(t.spots.lounge)??e.seat;default:return}}function nt(t,e){let n=I(t,e)??e.seat??ht(t);e.x=n.x,e.y=n.y,e.path=[],e.walking=!1,e.facing=O(e)?"up":"down",e.rest=2+e.seed%50/10}var O=t=>(t.state==="working"||t.state==="thinking"||t.state==="blocked")&&t.seat!==void 0&&t.seat.x===t.x&&t.seat.y===t.y&&t.path.length===0;function ot(t,e,n){if(!n)return;let i={x:Math.round(e.x),y:Math.round(e.y)};e.path=Z(t,i,n)??[]}function D(t,e){for(let n of t.agents)if(n.state!=="away"){if(n.path.length>0){let i=n.path[0],r=i.x-n.x,s=i.y-n.y,o=Math.hypot(r,s),a=3.2*e;Math.abs(r)>Math.abs(s)?n.facing=r>0?"right":"left":s!==0&&(n.facing=s>0?"down":"up"),n.walking=!0,o<=a?(n.x=i.x,n.y=i.y,n.path.shift()):(n.x+=r/o*a,n.y+=s/o*a);continue}n.walking=!1,n.state==="idle"&&(n.rest-=e,n.rest<=0&&(n.seed=V(String(n.seed)),n.rest=3+n.seed%60/10,ot(t,n,I(t,n)))),O(n)&&(n.facing="up")}}function P(t,e){if(Array.isArray(e.tasks)&&(t.tasks=S(e.tasks,60).map(et)),!Array.isArray(e.agents))return;let n=new Map(t.agents.map(r=>[r.id,r])),i=t.furniture.filter(r=>r.type==="desk").map(r=>({x:r.x+1,y:r.y+2})).filter(r=>R(t,r.x,r.y));t.agents=S(e.agents,40).map((r,s)=>{let o=tt(r,s),a=n.get(o.id);return o.seat=i[s],a?(Object.assign(a,{name:o.name,role:o.role,task:o.task,hair:o.hair,skin:o.skin,shirt:o.shirt,seat:o.seat}),a.state!==o.state&&(a.state=o.state,o.state!=="away"&&ot(t,a,I(t,a))),a):(nt(t,o),o)})}function L(t,e,n){let i,r=1/0;for(let s of t.agents){if(s.state==="away")continue;let o=e-(s.x+.5),a=n-(s.y+.1),u=Math.hypot(o,a);Math.abs(o)<.8&&a>-1.6&&a<1.1&&u<r&&(i=s,r=u)}return i}var d=16,f=(t,e,n,i,r,s)=>{t.fillStyle=e,t.fillRect(Math.round(n),Math.round(i),r,s)},bt=["...hhhhhh...","..hhhhhhhh..","..hhhhhhhh..","..hssssssh..","..ssessess..","..ssssssss..","...ssssss..."],pt=["...hhhhhh...","..hhhhhhhh..","..hhhhhhhh..","..hhhhhhhh..","..hhhhhhhh..","..hhhhhhhh..","...ssssss..."],yt=["...hhhhhh...","..hhhhhhhh..","..hhhhhhhh..","..hhssssss..","..hhsssess..","..hsssssss..","...ssssss..."],mt=["..tttttttt..",".tttttttttt.",".stttttttts.",".stTTTTTTts."],xt=["...tttttt...","...tttttt...","...ttsttt...","...TTsTTT..."],gt=["..llllllll..","..lll..lll..","..lll..lll..","..bbb..bbb.."],kt=["..llllllll..","..lll..lll..","..bbb..lll..",".......bbb.."],Mt=["..llllllll..","..lll..lll..","..lll..bbb..","..bbb......."],At=["...llllll...","...lll.lll..","...lll.lll..","...bbb.bbb.."],St=["...llllll...","..lll..lll..",".lll....lll.",".bb......bb."],wt=["...llllll...","...llllll...","....llll....","....bbbb...."];function $(t,e,n,i,r,s=!1){e.forEach((o,a)=>{for(let u=0;u<o.length;u++){let l=o[s?o.length-1-u:u],h=r[l];h&&f(t,h,n+u,i+a,1,1)}})}function Tt(t,e){let n=parseInt(t.slice(1).padEnd(6,t.slice(-1)),16),i=r=>Math.max(0,Math.min(255,(n>>r&255)+e));return`rgb(${i(16)},${i(8)},${i(0)})`}function vt(t,e,n,i){let r=e.x*d+2,s=O(e),o={h:e.hair,s:e.skin,e:"#1a1a24",t:e.shirt,T:Tt(e.shirt,-36),l:"#39415a",b:"#1f2433"},a=Math.floor(n*8+e.seed)%2===0,u=!e.walking&&Math.floor(n*1.5+e.seed%7)%2===0?1:0,l=s?11:15,h=e.y*d+(s?6:-1)-(e.walking&&a?1:0);s&&(f(t,"#1f2937",r+1,e.y*d+3,10,9),f(t,"#374151",r+2,e.y*d+11,8,3),f(t,"#111827",r+5,e.y*d+14,2,2)),t.fillStyle="rgba(0,0,0,0.25)",t.fillRect(Math.round(r+2),Math.round(e.y*d+14),8,2),i&&(t.fillStyle="rgba(255,255,255,0.28)",t.fillRect(Math.round(r-1),Math.round(e.y*d+13),14,4));let p=e.facing==="left"||e.facing==="right",x=p?yt:e.facing==="up"?pt:bt,k=p?xt:mt,M=e.walking?p?a?St:wt:a?kt:Mt:p?At:gt,c=e.facing==="left";if($(t,x,r,h-l+u*0,o,c),$(t,k,r,h-l+x.length,o,c),!s)$(t,M,r,h-l+x.length+k.length,o,c);else if(e.state==="working"){let b=Math.floor(n*9+e.seed)%2;f(t,e.skin,r+1+b,h-l+x.length+3,1,1),f(t,e.skin,r+10-(1-b),h-l+x.length+3,1,1)}}function W(t,e,n,i){f(t,"#111827",e-1,n-1,13,11),f(t,"#ffffff",e,n,11,9),f(t,"#ffffff",e+4,n+9,3,1),f(t,"#111827",e+4,n+10,3,1),i(e,n)}function Et(t,e,n){let i=Math.round(e.x*d+2),r=Math.round(e.y*d-26+(O(e)?8:0)),s=Math.floor(n*2+e.seed%3)%2===0;if(e.state==="blocked")W(t,i,r,(o,a)=>{f(t,s?"#dc2626":"#991b1b",o+5,a+1,2,5),f(t,s?"#dc2626":"#991b1b",o+5,a+7,2,1)});else if(e.state==="thinking"){let o=Math.floor(n*3)%4;W(t,i,r,(a,u)=>{for(let l=0;l<3;l++)f(t,l<o?"#111827":"#d1d5db",a+2+l*3,u+4,2,2)})}else if(e.state==="reviewing"&&!e.walking)W(t,i,r,(o,a)=>{f(t,"#2563eb",o+4,a+1,4,1),f(t,"#2563eb",o+7,a+2,1,2),f(t,"#2563eb",o+5,a+4,2,1),f(t,"#2563eb",o+5,a+5,1,1),f(t,"#2563eb",o+5,a+7,1,1)});else if(e.state==="done"){let o=s?"#f59e0b":"#fbbf24";W(t,i,r,(a,u)=>{f(t,o,a+5,u+1,1,7),f(t,o,a+2,u+3,7,2),f(t,o,a+4,u+2,3,5)})}}function Ot(t,e,n){for(let i=e.y;i<e.y+e.h;i++)for(let r=e.x;r<e.x+e.w;r++){let s=r*d,o=i*d;if(e.floor==="carpet"){f(t,"#4c4f7a",s,o,d,d);for(let a=0;a<6;a++)f(t,"#55588a",s+(r*7+a*5)%15,o+(i*3+a*7)%15,1,1)}else if(e.floor==="tile")f(t,(r+i)%2===0?"#cfd8e3":"#bcc7d4",s,o,d,d),f(t,"#aab5c2",s,o+15,d,1),f(t,"#aab5c2",s+15,o,1,d);else{f(t,"#a06f45",s,o,d,d);let a=i%2===0?0:8;f(t,"#8f6039",s,o+7,d,1),f(t,"#8f6039",s,o+15,d,1),f(t,"#8f6039",s+(a+r*8)%16,o,1,7),f(t,"#ad7c52",s+3,o+3,4,1)}}}var it="#2f3350",Ct="#565c86",Rt="#454a70";function Lt(t,e,n){let i=new Set;for(let r of e.rooms)for(let s=r.y;s<r.y+r.h;s++)for(let o=r.x;o<r.x+r.w;o++)i.add(`${o},${s}`);for(let r of e.doors)i.add(`${r.x},${r.y}`);for(let r=0;r<e.rows;r++)for(let s=0;s<e.cols;s++){if(i.has(`${s},${r}`))continue;let o=s*d,a=r*d;i.has(`${s},${r+1}`)?(f(t,Ct,o,a,d,d),f(t,Rt,o,a+13,d,3),f(t,n.primary,o,a+12,d,1),s%4===3&&r<=3&&(f(t,"#1f2937",o+1,a+1,14,9),f(t,"#8ed0ff",o+2,a+2,12,7),f(t,"#bfe6ff",o+3,a+3,4,2),f(t,"#1f2937",o+8,a+2,1,7))):f(t,it,o,a,d,d)}for(let r of e.doors)f(t,"#6b4a2f",r.x*d,r.y*d,d,d),f(t,"#7c5637",r.x*d+2,r.y*d,12,d)}function Wt(t,e,n,i,r,s,o){if(f(t,"#6b4427",e+1,n+13,46,17),f(t,"#8a5a33",e+1,n+11,46,11),f(t,"#a06c3f",e+1,n+11,46,2),f(t,"#4a2e1a",e+3,n+22,3,9),f(t,"#4a2e1a",e+42,n+22,3,9),f(t,"#111827",e+15,n-1,18,13),f(t,"#374151",e+22,n+12,4,2),i){f(t,"#0f2a2e",e+16,n,16,11);let a=Math.floor(r*3+s%13);for(let u=0;u<4;u++){let l=3+((s>>u)+(a+u)*7)%11;f(t,u%2===0?o.primary:"#7dd3fc",e+17,n+1+u*2.5,l,1)}t.fillStyle="rgba(125,211,252,0.10)",t.fillRect(e+11,n+11,26,8)}else f(t,"#1f2937",e+16,n,16,11),f(t,"#374151",e+18,n+2,3,1);f(t,"#d1d5db",e+17,n+15,14,4),f(t,"#9ca3af",e+18,n+16,12,1),f(t,"#f3f4f6",e+38,n+14,4,4),f(t,o.primary,e+38,n+16,4,1)}function _t(t,e,n,i){f(t,"#2b2118",e,n-11,64,26),f(t,"#d9c29c",e+2,n-9,60,22);let r={todo:"#fde68a",doing:"#93c5fd",done:"#86efac"},s=8;i.tasks.slice(0,s*2).forEach((o,a)=>{let u=a%s,l=Math.floor(a/s);f(t,"#00000033",e+5+u*7,n-6+l*9,6,7),f(t,r[o.state],e+4+u*7,n-7+l*9,6,7),f(t,"#00000040",e+5+u*7,n-5+l*9,4,1)})}function st(t,e,n,i,r){let s=e.x*d,o=e.y*d;switch(e.type){case"desk":{let a=e.x+1,u=e.y+2,l=n.agents.find(h=>h.seat?.x===a&&h.seat?.y===u&&O(h)&&h.state!=="blocked");Wt(t,s,o,!!l,i,l?.seed??0,r);break}case"coffee":f(t,"#374151",s,o+2,32,14),f(t,"#6b7280",s,o+2,32,2),f(t,"#111827",s+4,o-8,14,14),f(t,"#ef4444",s+15,o-5,2,2),f(t,"#f3f4f6",s+8,o+3,5,4),f(t,"#f3f4f6",s+22,o-1,5,5);for(let a=0;a<3;a++)t.fillStyle="rgba(255,255,255,0.45)",t.fillRect(s+9+Math.round(Math.sin(i*2+a)*1.5),o-1-(i*8+a*4)%9,1,2);break;case"water":f(t,"#e5e7eb",s+3,o+3,10,13),f(t,"#7dd3fc",s+4,o-7,8,10),f(t,"#bae6fd",s+5,o-6,2,8),f(t,"#3b82f6",s+5,o+6,2,2);break;case"sofa":f(t,r.primary,s+1,o-6,46,9),f(t,"#00000030",s+1,o+1,46,2),f(t,"#4b5563",s,o+3,48,11),f(t,"#6b7280",s+3,o+3,20,7),f(t,"#6b7280",s+25,o+3,20,7),f(t,"#374151",s,o+12,48,3);break;case"plant":f(t,"#92400e",s+4,o+9,8,7),f(t,"#b45309",s+3,o+8,10,2);for(let[a,u,l,h]of[[6,-3,4,11],[2,0,5,6],[9,1,5,6],[4,-6,3,6],[9,-5,3,5]])f(t,"#15803d",s+a,o+u,l,h);f(t,"#22c55e",s+7,o-3,2,8),f(t,"#22c55e",s+3,o+1,2,3);break;case"board":_t(t,s,o,n);break;case"shelf":f(t,"#5b3a21",s,o-12,32,28);for(let a=0;a<2;a++){f(t,"#3b2413",s+2,o-10+a*13,28,11);for(let u=0;u<8;u++){let l=["#ef4444","#3b82f6","#10b981","#f59e0b","#8b5cf6"][(u*3+a)%5];f(t,l,s+3+u*3,o-8+a*13+u%3,2,9-u%3)}}break;case"server":f(t,"#111827",s+1,o-12,14,28);for(let a=0;a<5;a++){f(t,"#1f2937",s+2,o-11+a*5,12,4);let u=Math.floor(i*3+a*2+e.x)%3!==0;f(t,u?"#22c55e":"#14532d",s+3,o-10+a*5,1,1),f(t,a%2===0?"#f59e0b":"#3b82f6",s+5,o-10+a*5,1,1)}break;case"table":f(t,"#57534e",s+2,o+14,44,14),f(t,"#78716c",s+2,o+3,44,14),f(t,"#a8a29e",s+2,o+3,44,2),f(t,"#f9fafb",s+10,o+6,8,6),f(t,"#f9fafb",s+28,o+8,8,6);break;case"rug":f(t,r.primary,s,o,64,48),t.fillStyle="rgba(0,0,0,0.35)",t.fillRect(s+3,o+3,58,42),f(t,r.primary,s+6,o+6,52,1),f(t,r.primary,s+6,o+41,52,1);break}}function Ft(t,e){t.font="bold 7px ui-monospace, Menlo, Consolas, monospace",t.textBaseline="top";for(let n of e.rooms){if(!n.name)continue;let i=n.name.toUpperCase(),r=n.x*d+3,s=n.y*d-12;t.fillStyle="rgba(0,0,0,0.45)",t.fillText(i,r+1,s+1),t.fillStyle="rgba(255,255,255,0.85)",t.fillText(i,r,s)}}function Bt(t,e,n,i){let r=e.name;t.font="bold 7px ui-monospace, Menlo, Consolas, monospace",t.textBaseline="top";let s=Math.ceil(t.measureText(r).width)+5,o=e.x*d+8,a=Math.round(Math.max(1,Math.min(i-s-1,o-s/2))),u=Math.round(e.y*d+15);t.fillStyle=n?"#ffffff":"rgba(17,24,39,0.82)",t.fillRect(a,u,s,10),t.fillStyle=n?"#111827":"#ffffff",t.fillText(r,a+2.5,u+1.5)}function It(t,e,n){let i=[],r="";for(let s of e.split(/\\s+/)){let o=r?`${r} ${s}`:s;t.measureText(o).width>n&&r?(i.push(r),r=s):r=o}return r&&i.push(r),i.slice(0,3)}var rt={working:"Working",thinking:"Thinking",blocked:"Blocked",reviewing:"Reviewing",idle:"On a break",done:"Finished",away:"Away"};function Dt(t,e,n){t.font="7px ui-monospace, Menlo, Consolas, monospace",t.textBaseline="top";let i=It(t,e.task||rt[e.state]||"",104),r=114,s=18+i.length*9+3,o=Math.round(Math.max(2,Math.min(n-r-2,e.x*d+8-r/2))),a=Math.round(Math.max(2,e.y*d-s-22));f(t,"#111827",o-1,a-1,r+2,s+2),f(t,"#ffffff",o,a,r,s),t.fillStyle="#111827",t.font="bold 7px ui-monospace, Menlo, Consolas, monospace",t.fillText(`${e.name}: ${rt[e.state]??""}`.slice(0,26),o+4,a+4),t.fillStyle="#374151",t.font="7px ui-monospace, Menlo, Consolas, monospace",i.forEach((u,l)=>t.fillText(u,o+4,a+15+l*9))}function Pt(t,e,n){if(e.tasks.length===0)return;let i=e.tasks.filter(o=>o.state==="done").length,r=`QUESTS ${i}/${e.tasks.length}`;t.font="bold 7px ui-monospace, Menlo, Consolas, monospace",t.textBaseline="top";let s=96;f(t,"rgba(17,24,39,0.85)",4,4,s,20),t.fillStyle="#ffffff",t.fillText(r,8,6.5),f(t,"#374151",8,16,s-8,4),f(t,n.primary,8,16,Math.round((s-8)*i/e.tasks.length),4)}function at(t,e,n,i,r){let s=e.cols*d;f(t,it,0,0,s,e.rows*d);for(let l of e.rooms)Ot(t,l,i);Lt(t,e,i);for(let l of e.furniture)l.type==="rug"&&st(t,l,e,n,i);let o=[];for(let l of e.furniture)l.type!=="rug"&&o.push({depth:(l.y+E[l.type].h)*d-2,draw:()=>st(t,l,e,n,i)});let a=e.agents.filter(l=>l.state!=="away");for(let l of a)o.push({depth:l.y*d+14,draw:()=>vt(t,l,n,l.id===r)});o.sort((l,h)=>l.depth-h.depth);for(let l of o)l.draw();Ft(t,e);for(let l of a)Bt(t,l,l.id===r,s);for(let l of a)l.id!==r&&Et(t,l,n);Pt(t,e,i);let u=a.find(l=>l.id===r);u&&Dt(t,u,s)}var $t=/^(#[0-9a-f]{3,8}|rgba?\\([\\d\\s.,%/]+\\)|hsla?\\([\\d\\s.,%/a-z]+\\))$/i;function Ht(t){let e=getComputedStyle(t),n=(i,r)=>{let s=e.getPropertyValue(i).trim();return $t.test(s)?s:r};return{primary:n("--blkc-color-primary","#3b82f6"),accent:n("--blkc-color-accent","#f59e0b"),background:n("--blkc-color-background","#1a1a2e"),text:n("--blkc-color-text","#ffffff")}}function H(t,e={},n={}){let i=B(e),r=t.getContext("2d");if(!r)throw new Error("This browser can\'t draw to a canvas.");let s=r,o=i.cols*d,a=i.rows*d,u=Ht(t),l=typeof matchMedia=="function"&&matchMedia("(prefers-reduced-motion: reduce)").matches,h,p=0,x=0,k=0,M=0,c=!0,b=!1,y=()=>{s.setTransform(p,0,0,p,0,0),s.imageSmoothingEnabled=!1,at(s,i,x,u,h)},T=()=>{let m=t.getBoundingClientRect().width||o,v=Math.max(1,Math.ceil(m*(typeof devicePixelRatio=="number"?devicePixelRatio:1)/o));v!==p&&(p=v,t.width=o*p,t.height=a*p,y())},U=m=>{if(b)return;if(M=requestAnimationFrame(U),!c){k=m;return}let g=Math.min((m-k)/1e3||0,.1);k=m,x+=g,D(i,g),y()},X=m=>{h=m===h?void 0:m,n.onSelect?.(h),l&&y()},G=m=>{let g=t.getBoundingClientRect();return{x:(m.clientX-g.left)/g.width*i.cols,y:(m.clientY-g.top)/g.height*i.rows}},K=m=>{let{x:g,y:v}=G(m);X(L(i,g,v)?.id)},j=m=>{let{x:g,y:v}=G(m);t.style.cursor=L(i,g,v)?"pointer":"default"};t.addEventListener("pointerdown",K),t.addEventListener("pointermove",j);let q=typeof ResizeObserver=="function"?new ResizeObserver(T):void 0;q?.observe(t);let z=typeof IntersectionObserver=="function"?new IntersectionObserver(m=>{c=m.some(g=>g.isIntersecting)}):void 0;return z?.observe(t),T(),p===0&&(p=1,y()),l||(M=requestAnimationFrame(U)),{world:i,update(m){P(i,m),l&&y()},select:X,destroy(){b=!0,cancelAnimationFrame(M),q?.disconnect(),z?.disconnect(),t.removeEventListener("pointerdown",K),t.removeEventListener("pointermove",j)}}}var lt=new Map;function Nt(t,e){lt.set(t,e)}function Ut(t,e,n){let i=[...n.querySelectorAll("button[data-blkc-agent]")],r=H(t,e,{onSelect(s){for(let o of i)o.setAttribute("aria-pressed",String(o.dataset.blkcAgent===s))}});for(let s of i)s.disabled=!1,s.addEventListener("click",()=>r.select(s.dataset.blkcAgent));return r}Nt("office",Ut);var ft=new WeakSet;function N(t=document){let e=[];for(let n of t.querySelectorAll("canvas[data-blkc-canvas]")){if(ft.has(n))continue;let i=lt.get(n.dataset.blkcCanvas??"");if(!i)continue;let r=n.closest("[data-blkc-canvas-root]")??n.parentElement??n,s=r.querySelector("script[data-blkc-canvas-data]"),o={};try{o=JSON.parse(s?.textContent||"{}")}catch{o={}}ft.add(n);let a=i(n,o,r);e.push({element:n,destroy:()=>a.destroy()})}return e}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>N()):N();})();\n/**\n * BLKC Render-Canvas.\n *\n * A canvas Block is ordinary markup from @blkc-code/render-web plus its data, and this\n * package brings it to life. Call mountCanvasBlocks() once the page is in the document:\n * a <canvas data-blkc-canvas="office"> with a JSON <script> beside it starts running.\n *\n * @package @blkc-code/render-canvas\n * @license Apache-2.0\n */\n';
68252
68652
 
68253
68653
  // src/commands/dev-shell.ts
68254
68654
  var SHELL_HTML = `<!doctype html>
@@ -68350,8 +68750,9 @@ function renderFrames() {
68350
68750
  const names = width === "all" ? Object.keys(WIDTHS) : [width];
68351
68751
  for (const name of names) {
68352
68752
  const frame = make("iframe", { title: item.name + " at " + name + " width", src: frameSrc(item) });
68353
- // No allow-scripts and no allow-same-origin: rendered content stays inert.
68354
- frame.setAttribute("sandbox", "allow-popups allow-popups-to-escape-sandbox");
68753
+ // Scripts for the canvas runtime only (the page policy allows no other), and no same-origin,
68754
+ // so nothing in a frame can reach this page, its storage or the server.
68755
+ frame.setAttribute("sandbox", "allow-scripts allow-popups allow-popups-to-escape-sandbox");
68355
68756
  const figure = make("figure", {}, make("figcaption", { textContent: name + " \xB7 " + WIDTHS[name] + "px" }), frame);
68356
68757
  figure.style.width = WIDTHS[name] + "px";
68357
68758
  box.append(figure);
@@ -74494,7 +74895,7 @@ async function rc(e2, i = {}) {
74494
74895
  var theme_default = "@theme default {\n --font-sans:\n -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', 'Noto Sans', Arial,\n sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';\n --font-serif: ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif;\n --font-mono:\n ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New',\n monospace;\n\n --color-red-50: oklch(97.1% 0.013 17.38);\n --color-red-100: oklch(93.6% 0.032 17.717);\n --color-red-200: oklch(88.5% 0.062 18.334);\n --color-red-300: oklch(80.8% 0.114 19.571);\n --color-red-400: oklch(70.4% 0.191 22.216);\n --color-red-500: oklch(63.7% 0.237 25.331);\n --color-red-600: oklch(57.7% 0.245 27.325);\n --color-red-700: oklch(50.5% 0.213 27.518);\n --color-red-800: oklch(44.4% 0.177 26.899);\n --color-red-900: oklch(39.6% 0.141 25.723);\n --color-red-950: oklch(25.8% 0.092 26.042);\n\n --color-orange-50: oklch(98% 0.016 73.684);\n --color-orange-100: oklch(95.4% 0.038 75.164);\n --color-orange-200: oklch(90.1% 0.076 70.697);\n --color-orange-300: oklch(83.7% 0.128 66.29);\n --color-orange-400: oklch(75% 0.183 55.934);\n --color-orange-500: oklch(70.5% 0.213 47.604);\n --color-orange-600: oklch(64.6% 0.222 41.116);\n --color-orange-700: oklch(55.3% 0.195 38.402);\n --color-orange-800: oklch(47% 0.157 37.304);\n --color-orange-900: oklch(40.8% 0.123 38.172);\n --color-orange-950: oklch(26.6% 0.079 36.259);\n\n --color-amber-50: oklch(98.7% 0.022 95.277);\n --color-amber-100: oklch(96.2% 0.059 95.617);\n --color-amber-200: oklch(92.4% 0.12 95.746);\n --color-amber-300: oklch(87.9% 0.169 91.605);\n --color-amber-400: oklch(82.8% 0.189 84.429);\n --color-amber-500: oklch(76.9% 0.188 70.08);\n --color-amber-600: oklch(66.6% 0.179 58.318);\n --color-amber-700: oklch(55.5% 0.163 48.998);\n --color-amber-800: oklch(47.3% 0.137 46.201);\n --color-amber-900: oklch(41.4% 0.112 45.904);\n --color-amber-950: oklch(27.9% 0.077 45.635);\n\n --color-yellow-50: oklch(98.7% 0.026 102.212);\n --color-yellow-100: oklch(97.3% 0.071 103.193);\n --color-yellow-200: oklch(94.5% 0.129 101.54);\n --color-yellow-300: oklch(90.5% 0.182 98.111);\n --color-yellow-400: oklch(85.2% 0.199 91.936);\n --color-yellow-500: oklch(79.5% 0.184 86.047);\n --color-yellow-600: oklch(68.1% 0.162 75.834);\n --color-yellow-700: oklch(55.4% 0.135 66.442);\n --color-yellow-800: oklch(47.6% 0.114 61.907);\n --color-yellow-900: oklch(42.1% 0.095 57.708);\n --color-yellow-950: oklch(28.6% 0.066 53.813);\n\n --color-lime-50: oklch(98.6% 0.031 120.757);\n --color-lime-100: oklch(96.7% 0.067 122.328);\n --color-lime-200: oklch(93.8% 0.127 124.321);\n --color-lime-300: oklch(89.7% 0.196 126.665);\n --color-lime-400: oklch(84.1% 0.238 128.85);\n --color-lime-500: oklch(76.8% 0.233 130.85);\n --color-lime-600: oklch(64.8% 0.2 131.684);\n --color-lime-700: oklch(53.2% 0.157 131.589);\n --color-lime-800: oklch(45.3% 0.124 130.933);\n --color-lime-900: oklch(40.5% 0.101 131.063);\n --color-lime-950: oklch(27.4% 0.072 132.109);\n\n --color-green-50: oklch(98.2% 0.018 155.826);\n --color-green-100: oklch(96.2% 0.044 156.743);\n --color-green-200: oklch(92.5% 0.084 155.995);\n --color-green-300: oklch(87.1% 0.15 154.449);\n --color-green-400: oklch(79.2% 0.209 151.711);\n --color-green-500: oklch(72.3% 0.219 149.579);\n --color-green-600: oklch(62.7% 0.194 149.214);\n --color-green-700: oklch(52.7% 0.154 150.069);\n --color-green-800: oklch(44.8% 0.119 151.328);\n --color-green-900: oklch(39.3% 0.095 152.535);\n --color-green-950: oklch(26.6% 0.065 152.934);\n\n --color-emerald-50: oklch(97.9% 0.021 166.113);\n --color-emerald-100: oklch(95% 0.052 163.051);\n --color-emerald-200: oklch(90.5% 0.093 164.15);\n --color-emerald-300: oklch(84.5% 0.143 164.978);\n --color-emerald-400: oklch(76.5% 0.177 163.223);\n --color-emerald-500: oklch(69.6% 0.17 162.48);\n --color-emerald-600: oklch(59.6% 0.145 163.225);\n --color-emerald-700: oklch(50.8% 0.118 165.612);\n --color-emerald-800: oklch(43.2% 0.095 166.913);\n --color-emerald-900: oklch(37.8% 0.077 168.94);\n --color-emerald-950: oklch(26.2% 0.051 172.552);\n\n --color-teal-50: oklch(98.4% 0.014 180.72);\n --color-teal-100: oklch(95.3% 0.051 180.801);\n --color-teal-200: oklch(91% 0.096 180.426);\n --color-teal-300: oklch(85.5% 0.138 181.071);\n --color-teal-400: oklch(77.7% 0.152 181.912);\n --color-teal-500: oklch(70.4% 0.14 182.503);\n --color-teal-600: oklch(60% 0.118 184.704);\n --color-teal-700: oklch(51.1% 0.096 186.391);\n --color-teal-800: oklch(43.7% 0.078 188.216);\n --color-teal-900: oklch(38.6% 0.063 188.416);\n --color-teal-950: oklch(27.7% 0.046 192.524);\n\n --color-cyan-50: oklch(98.4% 0.019 200.873);\n --color-cyan-100: oklch(95.6% 0.045 203.388);\n --color-cyan-200: oklch(91.7% 0.08 205.041);\n --color-cyan-300: oklch(86.5% 0.127 207.078);\n --color-cyan-400: oklch(78.9% 0.154 211.53);\n --color-cyan-500: oklch(71.5% 0.143 215.221);\n --color-cyan-600: oklch(60.9% 0.126 221.723);\n --color-cyan-700: oklch(52% 0.105 223.128);\n --color-cyan-800: oklch(45% 0.085 224.283);\n --color-cyan-900: oklch(39.8% 0.07 227.392);\n --color-cyan-950: oklch(30.2% 0.056 229.695);\n\n --color-sky-50: oklch(97.7% 0.013 236.62);\n --color-sky-100: oklch(95.1% 0.026 236.824);\n --color-sky-200: oklch(90.1% 0.058 230.902);\n --color-sky-300: oklch(82.8% 0.111 230.318);\n --color-sky-400: oklch(74.6% 0.16 232.661);\n --color-sky-500: oklch(68.5% 0.169 237.323);\n --color-sky-600: oklch(58.8% 0.158 241.966);\n --color-sky-700: oklch(50% 0.134 242.749);\n --color-sky-800: oklch(44.3% 0.11 240.79);\n --color-sky-900: oklch(39.1% 0.09 240.876);\n --color-sky-950: oklch(29.3% 0.066 243.157);\n\n --color-blue-50: oklch(97% 0.014 254.604);\n --color-blue-100: oklch(93.2% 0.032 255.585);\n --color-blue-200: oklch(88.2% 0.059 254.128);\n --color-blue-300: oklch(80.9% 0.105 251.813);\n --color-blue-400: oklch(70.7% 0.165 254.624);\n --color-blue-500: oklch(62.3% 0.214 259.815);\n --color-blue-600: oklch(54.6% 0.245 262.881);\n --color-blue-700: oklch(48.8% 0.243 264.376);\n --color-blue-800: oklch(42.4% 0.199 265.638);\n --color-blue-900: oklch(37.9% 0.146 265.522);\n --color-blue-950: oklch(28.2% 0.091 267.935);\n\n --color-indigo-50: oklch(96.2% 0.018 272.314);\n --color-indigo-100: oklch(93% 0.034 272.788);\n --color-indigo-200: oklch(87% 0.065 274.039);\n --color-indigo-300: oklch(78.5% 0.115 274.713);\n --color-indigo-400: oklch(67.3% 0.182 276.935);\n --color-indigo-500: oklch(58.5% 0.233 277.117);\n --color-indigo-600: oklch(51.1% 0.262 276.966);\n --color-indigo-700: oklch(45.7% 0.24 277.023);\n --color-indigo-800: oklch(39.8% 0.195 277.366);\n --color-indigo-900: oklch(35.9% 0.144 278.697);\n --color-indigo-950: oklch(25.7% 0.09 281.288);\n\n --color-violet-50: oklch(96.9% 0.016 293.756);\n --color-violet-100: oklch(94.3% 0.029 294.588);\n --color-violet-200: oklch(89.4% 0.057 293.283);\n --color-violet-300: oklch(81.1% 0.111 293.571);\n --color-violet-400: oklch(70.2% 0.183 293.541);\n --color-violet-500: oklch(60.6% 0.25 292.717);\n --color-violet-600: oklch(54.1% 0.281 293.009);\n --color-violet-700: oklch(49.1% 0.27 292.581);\n --color-violet-800: oklch(43.2% 0.232 292.759);\n --color-violet-900: oklch(38% 0.189 293.745);\n --color-violet-950: oklch(28.3% 0.141 291.089);\n\n --color-purple-50: oklch(97.7% 0.014 308.299);\n --color-purple-100: oklch(94.6% 0.033 307.174);\n --color-purple-200: oklch(90.2% 0.063 306.703);\n --color-purple-300: oklch(82.7% 0.119 306.383);\n --color-purple-400: oklch(71.4% 0.203 305.504);\n --color-purple-500: oklch(62.7% 0.265 303.9);\n --color-purple-600: oklch(55.8% 0.288 302.321);\n --color-purple-700: oklch(49.6% 0.265 301.924);\n --color-purple-800: oklch(43.8% 0.218 303.724);\n --color-purple-900: oklch(38.1% 0.176 304.987);\n --color-purple-950: oklch(29.1% 0.149 302.717);\n\n --color-fuchsia-50: oklch(97.7% 0.017 320.058);\n --color-fuchsia-100: oklch(95.2% 0.037 318.852);\n --color-fuchsia-200: oklch(90.3% 0.076 319.62);\n --color-fuchsia-300: oklch(83.3% 0.145 321.434);\n --color-fuchsia-400: oklch(74% 0.238 322.16);\n --color-fuchsia-500: oklch(66.7% 0.295 322.15);\n --color-fuchsia-600: oklch(59.1% 0.293 322.896);\n --color-fuchsia-700: oklch(51.8% 0.253 323.949);\n --color-fuchsia-800: oklch(45.2% 0.211 324.591);\n --color-fuchsia-900: oklch(40.1% 0.17 325.612);\n --color-fuchsia-950: oklch(29.3% 0.136 325.661);\n\n --color-pink-50: oklch(97.1% 0.014 343.198);\n --color-pink-100: oklch(94.8% 0.028 342.258);\n --color-pink-200: oklch(89.9% 0.061 343.231);\n --color-pink-300: oklch(82.3% 0.12 346.018);\n --color-pink-400: oklch(71.8% 0.202 349.761);\n --color-pink-500: oklch(65.6% 0.241 354.308);\n --color-pink-600: oklch(59.2% 0.249 0.584);\n --color-pink-700: oklch(52.5% 0.223 3.958);\n --color-pink-800: oklch(45.9% 0.187 3.815);\n --color-pink-900: oklch(40.8% 0.153 2.432);\n --color-pink-950: oklch(28.4% 0.109 3.907);\n\n --color-rose-50: oklch(96.9% 0.015 12.422);\n --color-rose-100: oklch(94.1% 0.03 12.58);\n --color-rose-200: oklch(89.2% 0.058 10.001);\n --color-rose-300: oklch(81% 0.117 11.638);\n --color-rose-400: oklch(71.2% 0.194 13.428);\n --color-rose-500: oklch(64.5% 0.246 16.439);\n --color-rose-600: oklch(58.6% 0.253 17.585);\n --color-rose-700: oklch(51.4% 0.222 16.935);\n --color-rose-800: oklch(45.5% 0.188 13.697);\n --color-rose-900: oklch(41% 0.159 10.272);\n --color-rose-950: oklch(27.1% 0.105 12.094);\n\n --color-slate-50: oklch(98.4% 0.003 247.858);\n --color-slate-100: oklch(96.8% 0.007 247.896);\n --color-slate-200: oklch(92.9% 0.013 255.508);\n --color-slate-300: oklch(86.9% 0.022 252.894);\n --color-slate-400: oklch(70.4% 0.04 256.788);\n --color-slate-500: oklch(55.4% 0.046 257.417);\n --color-slate-600: oklch(44.6% 0.043 257.281);\n --color-slate-700: oklch(37.2% 0.044 257.287);\n --color-slate-800: oklch(27.9% 0.041 260.031);\n --color-slate-900: oklch(20.8% 0.042 265.755);\n --color-slate-950: oklch(12.9% 0.042 264.695);\n\n --color-gray-50: oklch(98.5% 0.002 247.839);\n --color-gray-100: oklch(96.7% 0.003 264.542);\n --color-gray-200: oklch(92.8% 0.006 264.531);\n --color-gray-300: oklch(87.2% 0.01 258.338);\n --color-gray-400: oklch(70.7% 0.022 261.325);\n --color-gray-500: oklch(55.1% 0.027 264.364);\n --color-gray-600: oklch(44.6% 0.03 256.802);\n --color-gray-700: oklch(37.3% 0.034 259.733);\n --color-gray-800: oklch(27.8% 0.033 256.848);\n --color-gray-900: oklch(21% 0.034 264.665);\n --color-gray-950: oklch(13% 0.028 261.692);\n\n --color-zinc-50: oklch(98.5% 0 none);\n --color-zinc-100: oklch(96.7% 0.001 286.375);\n --color-zinc-200: oklch(92% 0.004 286.32);\n --color-zinc-300: oklch(87.1% 0.006 286.286);\n --color-zinc-400: oklch(70.5% 0.015 286.067);\n --color-zinc-500: oklch(55.2% 0.016 285.938);\n --color-zinc-600: oklch(44.2% 0.017 285.786);\n --color-zinc-700: oklch(37% 0.013 285.805);\n --color-zinc-800: oklch(27.4% 0.006 286.033);\n --color-zinc-900: oklch(21% 0.006 285.885);\n --color-zinc-950: oklch(14.1% 0.005 285.823);\n\n --color-neutral-50: oklch(98.5% 0 none);\n --color-neutral-100: oklch(97% 0 none);\n --color-neutral-200: oklch(92.2% 0 none);\n --color-neutral-300: oklch(87% 0 none);\n --color-neutral-400: oklch(70.8% 0 none);\n --color-neutral-500: oklch(55.6% 0 none);\n --color-neutral-600: oklch(43.9% 0 none);\n --color-neutral-700: oklch(37.1% 0 none);\n --color-neutral-800: oklch(26.9% 0 none);\n --color-neutral-900: oklch(20.5% 0 none);\n --color-neutral-950: oklch(14.5% 0 none);\n\n --color-stone-50: oklch(98.5% 0.001 106.423);\n --color-stone-100: oklch(97% 0.001 106.424);\n --color-stone-200: oklch(92.3% 0.003 48.717);\n --color-stone-300: oklch(86.9% 0.005 56.366);\n --color-stone-400: oklch(70.9% 0.01 56.259);\n --color-stone-500: oklch(55.3% 0.013 58.071);\n --color-stone-600: oklch(44.4% 0.011 73.639);\n --color-stone-700: oklch(37.4% 0.01 67.558);\n --color-stone-800: oklch(26.8% 0.007 34.298);\n --color-stone-900: oklch(21.6% 0.006 56.043);\n --color-stone-950: oklch(14.7% 0.004 49.25);\n\n --color-mauve-50: oklch(98.5% 0 none);\n --color-mauve-100: oklch(96% 0.003 325.6);\n --color-mauve-200: oklch(92.2% 0.005 325.62);\n --color-mauve-300: oklch(86.5% 0.012 325.68);\n --color-mauve-400: oklch(71.1% 0.019 323.02);\n --color-mauve-500: oklch(54.2% 0.034 322.5);\n --color-mauve-600: oklch(43.5% 0.029 321.78);\n --color-mauve-700: oklch(36.4% 0.029 323.89);\n --color-mauve-800: oklch(26.3% 0.024 320.12);\n --color-mauve-900: oklch(21.2% 0.019 322.12);\n --color-mauve-950: oklch(14.5% 0.008 326);\n\n --color-olive-50: oklch(98.8% 0.003 106.5);\n --color-olive-100: oklch(96.6% 0.005 106.5);\n --color-olive-200: oklch(93% 0.007 106.5);\n --color-olive-300: oklch(88% 0.011 106.6);\n --color-olive-400: oklch(73.7% 0.021 106.9);\n --color-olive-500: oklch(58% 0.031 107.3);\n --color-olive-600: oklch(46.6% 0.025 107.3);\n --color-olive-700: oklch(39.4% 0.023 107.4);\n --color-olive-800: oklch(28.6% 0.016 107.4);\n --color-olive-900: oklch(22.8% 0.013 107.4);\n --color-olive-950: oklch(15.3% 0.006 107.1);\n\n --color-mist-50: oklch(98.7% 0.002 197.1);\n --color-mist-100: oklch(96.3% 0.002 197.1);\n --color-mist-200: oklch(92.5% 0.005 214.3);\n --color-mist-300: oklch(87.2% 0.007 219.6);\n --color-mist-400: oklch(72.3% 0.014 214.4);\n --color-mist-500: oklch(56% 0.021 213.5);\n --color-mist-600: oklch(45% 0.017 213.2);\n --color-mist-700: oklch(37.8% 0.015 216);\n --color-mist-800: oklch(27.5% 0.011 216.9);\n --color-mist-900: oklch(21.8% 0.008 223.9);\n --color-mist-950: oklch(14.8% 0.004 228.8);\n\n --color-taupe-50: oklch(98.6% 0.002 67.8);\n --color-taupe-100: oklch(96% 0.002 17.2);\n --color-taupe-200: oklch(92.2% 0.005 34.3);\n --color-taupe-300: oklch(86.8% 0.007 39.5);\n --color-taupe-400: oklch(71.4% 0.014 41.2);\n --color-taupe-500: oklch(54.7% 0.021 43.1);\n --color-taupe-600: oklch(43.8% 0.017 39.3);\n --color-taupe-700: oklch(36.7% 0.016 35.7);\n --color-taupe-800: oklch(26.8% 0.011 36.5);\n --color-taupe-900: oklch(21.4% 0.009 43.1);\n --color-taupe-950: oklch(14.7% 0.004 49.3);\n\n --color-black: #000;\n --color-white: #fff;\n\n --spacing: 0.25rem;\n\n --breakpoint-sm: 40rem;\n --breakpoint-md: 48rem;\n --breakpoint-lg: 64rem;\n --breakpoint-xl: 80rem;\n --breakpoint-2xl: 96rem;\n\n --container-3xs: 16rem;\n --container-2xs: 18rem;\n --container-xs: 20rem;\n --container-sm: 24rem;\n --container-md: 28rem;\n --container-lg: 32rem;\n --container-xl: 36rem;\n --container-2xl: 42rem;\n --container-3xl: 48rem;\n --container-4xl: 56rem;\n --container-5xl: 64rem;\n --container-6xl: 72rem;\n --container-7xl: 80rem;\n\n --text-xs: 0.75rem;\n --text-xs--line-height: calc(1 / 0.75);\n --text-sm: 0.875rem;\n --text-sm--line-height: calc(1.25 / 0.875);\n --text-base: 1rem;\n --text-base--line-height: calc(1.5 / 1);\n --text-lg: 1.125rem;\n --text-lg--line-height: calc(1.75 / 1.125);\n --text-xl: 1.25rem;\n --text-xl--line-height: calc(1.75 / 1.25);\n --text-2xl: 1.5rem;\n --text-2xl--line-height: calc(2 / 1.5);\n --text-3xl: 1.875rem;\n --text-3xl--line-height: calc(2.25 / 1.875);\n --text-4xl: 2.25rem;\n --text-4xl--line-height: calc(2.5 / 2.25);\n --text-5xl: 3rem;\n --text-5xl--line-height: 1;\n --text-6xl: 3.75rem;\n --text-6xl--line-height: 1;\n --text-7xl: 4.5rem;\n --text-7xl--line-height: 1;\n --text-8xl: 6rem;\n --text-8xl--line-height: 1;\n --text-9xl: 8rem;\n --text-9xl--line-height: 1;\n\n --font-weight-thin: 100;\n --font-weight-extralight: 200;\n --font-weight-light: 300;\n --font-weight-normal: 400;\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n --font-weight-extrabold: 800;\n --font-weight-black: 900;\n\n --tracking-tighter: -0.05em;\n --tracking-tight: -0.025em;\n --tracking-normal: 0em;\n --tracking-wide: 0.025em;\n --tracking-wider: 0.05em;\n --tracking-widest: 0.1em;\n\n --leading-tight: 1.25;\n --leading-snug: 1.375;\n --leading-normal: 1.5;\n --leading-relaxed: 1.625;\n --leading-loose: 2;\n\n --radius-xs: 0.125rem;\n --radius-sm: 0.25rem;\n --radius-md: 0.375rem;\n --radius-lg: 0.5rem;\n --radius-xl: 0.75rem;\n --radius-2xl: 1rem;\n --radius-3xl: 1.5rem;\n --radius-4xl: 2rem;\n\n --shadow-2xs: 0 1px rgb(0 0 0 / 0.05);\n --shadow-xs: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);\n --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);\n --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);\n --shadow-2xl: 0 25px 50px -12px rgb(0 0 0 / 0.25);\n\n --inset-shadow-2xs: inset 0 1px rgb(0 0 0 / 0.05);\n --inset-shadow-xs: inset 0 1px 1px rgb(0 0 0 / 0.05);\n --inset-shadow-sm: inset 0 2px 4px rgb(0 0 0 / 0.05);\n\n --drop-shadow-xs: 0 1px 1px rgb(0 0 0 / 0.05);\n --drop-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.15);\n --drop-shadow-md: 0 3px 3px rgb(0 0 0 / 0.12);\n --drop-shadow-lg: 0 4px 4px rgb(0 0 0 / 0.15);\n --drop-shadow-xl: 0 9px 7px rgb(0 0 0 / 0.1);\n --drop-shadow-2xl: 0 25px 25px rgb(0 0 0 / 0.15);\n\n --text-shadow-2xs: 0px 1px 0px rgb(0 0 0 / 0.15);\n --text-shadow-xs: 0px 1px 1px rgb(0 0 0 / 0.2);\n --text-shadow-sm:\n 0px 1px 0px rgb(0 0 0 / 0.075), 0px 1px 1px rgb(0 0 0 / 0.075), 0px 2px 2px rgb(0 0 0 / 0.075);\n --text-shadow-md:\n 0px 1px 1px rgb(0 0 0 / 0.1), 0px 1px 2px rgb(0 0 0 / 0.1), 0px 2px 4px rgb(0 0 0 / 0.1);\n --text-shadow-lg:\n 0px 1px 2px rgb(0 0 0 / 0.1), 0px 3px 2px rgb(0 0 0 / 0.1), 0px 4px 8px rgb(0 0 0 / 0.1);\n\n --ease-in: cubic-bezier(0.4, 0, 1, 1);\n --ease-out: cubic-bezier(0, 0, 0.2, 1);\n --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);\n\n --animate-spin: spin 1s linear infinite;\n --animate-ping: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;\n --animate-pulse: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;\n --animate-bounce: bounce 1s infinite;\n\n @keyframes spin {\n to {\n transform: rotate(360deg);\n }\n }\n\n @keyframes ping {\n 75%,\n 100% {\n transform: scale(2);\n opacity: 0;\n }\n }\n\n @keyframes pulse {\n 50% {\n opacity: 0.5;\n }\n }\n\n @keyframes bounce {\n 0%,\n 100% {\n transform: translateY(-25%);\n animation-timing-function: cubic-bezier(0.8, 0, 1, 1);\n }\n\n 50% {\n transform: none;\n animation-timing-function: cubic-bezier(0, 0, 0.2, 1);\n }\n }\n\n --blur-xs: 4px;\n --blur-sm: 8px;\n --blur-md: 12px;\n --blur-lg: 16px;\n --blur-xl: 24px;\n --blur-2xl: 40px;\n --blur-3xl: 64px;\n\n --perspective-dramatic: 100px;\n --perspective-near: 300px;\n --perspective-normal: 500px;\n --perspective-midrange: 800px;\n --perspective-distant: 1200px;\n\n --aspect-video: 16 / 9;\n\n --default-transition-duration: 150ms;\n --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n --default-font-family: --theme(--font-sans, initial);\n --default-font-feature-settings: --theme(--font-sans--font-feature-settings, initial);\n --default-font-variation-settings: --theme(--font-sans--font-variation-settings, initial);\n --default-mono-font-family: --theme(--font-mono, initial);\n --default-mono-font-feature-settings: --theme(--font-mono--font-feature-settings, initial);\n --default-mono-font-variation-settings: --theme(--font-mono--font-variation-settings, initial);\n}\n\n/* Deprecated */\n@theme default inline reference {\n --blur: 8px;\n --shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);\n --shadow-inner: inset 0 2px 4px 0 rgb(0 0 0 / 0.05);\n --drop-shadow: 0 1px 2px rgb(0 0 0 / 0.1), 0 1px 1px rgb(0 0 0 / 0.06);\n --radius: 0.25rem;\n --max-width-prose: 65ch;\n}\n";
74495
74896
 
74496
74897
  // ../render-web/src/theme.css
74497
- var theme_default2 = "/* Tailwind theme for the renderer classes. Generated values match blkcThemeCss() in\n @blkc-code/tailwind-preset, and a test keeps the two in step. */\n@theme inline {\n --color-primary: var(--blkc-color-primary, #0066cc);\n --color-primary-foreground: var(--blkc-color-background, #ffffff);\n --color-secondary: var(--blkc-color-secondary, #6c757d);\n --color-secondary-foreground: var(--blkc-color-background, #ffffff);\n --color-background: var(--blkc-color-background, #ffffff);\n --color-foreground: var(--blkc-color-text, #1a1a1a);\n --color-muted: var(--blkc-color-background, #ffffff);\n --color-muted-foreground: var(--blkc-color-text-secondary, #6c757d);\n --color-border: var(--blkc-color-border, #e0e0e0);\n --color-input: var(--blkc-color-border, #e0e0e0);\n --color-accent: var(--blkc-color-primary, #0066cc);\n --color-accent-foreground: var(--blkc-color-background, #ffffff);\n --color-ring: var(--blkc-color-primary, #0066cc);\n --radius-blkc: var(--blkc-border-radius, 8px);\n --container-blkc: var(--blkc-max-width, 1200px);\n --font-blkc: var(--blkc-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif);\n --shadow-blkc: var(--blkc-shadow-md, 0 4px 6px rgba(0, 0, 0, 0.1));\n --shadow-blkc-sm: var(--blkc-shadow-sm, 0 1px 2px rgba(0, 0, 0, 0.05));\n --shadow-blkc-lg: var(--blkc-shadow-lg, 0 10px 15px rgba(0, 0, 0, 0.1));\n --spacing-blkc-xs: var(--blkc-spacing-xs, 0.25rem);\n --spacing-blkc-sm: var(--blkc-spacing-sm, 0.5rem);\n --spacing-blkc-md: var(--blkc-spacing-md, 1rem);\n --spacing-blkc-lg: var(--blkc-spacing-lg, 2rem);\n --spacing-blkc-xl: var(--blkc-spacing-xl, 4rem);\n}\n";
74898
+ var theme_default2 = "/* Tailwind theme for the renderer classes. Generated values match blkcThemeCss() in\n @blkc-code/tailwind-preset, and a test keeps the two in step. */\n@theme inline {\n --color-primary: var(--blkc-color-primary, #0066cc);\n --color-primary-foreground: var(--blkc-color-background, #ffffff);\n --color-secondary: var(--blkc-color-secondary, #6c757d);\n --color-secondary-foreground: var(--blkc-color-background, #ffffff);\n --color-background: var(--blkc-color-background, #ffffff);\n --color-foreground: var(--blkc-color-text, #1a1a1a);\n --color-muted: var(--blkc-color-surface, color-mix(in srgb, var(--blkc-color-text, #1a1a1a) 6%, var(--blkc-color-background, #ffffff)));\n --color-muted-foreground: var(--blkc-color-text-secondary, #6c757d);\n --color-border: var(--blkc-color-border, color-mix(in srgb, var(--blkc-color-text, #1a1a1a) 16%, var(--blkc-color-background, #ffffff)));\n --color-input: var(--blkc-color-border, color-mix(in srgb, var(--blkc-color-text, #1a1a1a) 16%, var(--blkc-color-background, #ffffff)));\n --color-accent: var(--blkc-color-accent, var(--blkc-color-primary, #0066cc));\n --color-accent-foreground: var(--blkc-color-background, #ffffff);\n --color-ring: var(--blkc-color-primary, #0066cc);\n --radius-blkc: var(--blkc-border-radius, 8px);\n --container-blkc: var(--blkc-max-width, 1200px);\n --font-blkc: var(--blkc-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif);\n --shadow-blkc: var(--blkc-shadow-md, 0 4px 6px rgba(0, 0, 0, 0.1));\n --shadow-blkc-sm: var(--blkc-shadow-sm, 0 1px 2px rgba(0, 0, 0, 0.05));\n --shadow-blkc-lg: var(--blkc-shadow-lg, 0 10px 15px rgba(0, 0, 0, 0.1));\n --spacing-blkc-xs: var(--blkc-spacing-xs, 0.25rem);\n --spacing-blkc-sm: var(--blkc-spacing-sm, 0.5rem);\n --spacing-blkc-md: var(--blkc-spacing-md, 1rem);\n --spacing-blkc-lg: var(--blkc-spacing-lg, 2rem);\n --spacing-blkc-xl: var(--blkc-spacing-xl, 4rem);\n}\n";
74498
74899
 
74499
74900
  // src/commands/local-blocks.ts
74500
74901
  var { getBlockComponent: getBlockComponent2, registerBlock: registerBlock2, unregisterBlock: unregisterBlock2 } = dist_exports;
@@ -74604,6 +75005,24 @@ async function readCompanions(dir) {
74604
75005
  }
74605
75006
  return out;
74606
75007
  }
75008
+ async function applyOfficeState(dir, pages) {
75009
+ let state;
75010
+ try {
75011
+ state = await readJson(import_node_path12.default.join(dir, "office-state.json"));
75012
+ } catch {
75013
+ return;
75014
+ }
75015
+ for (const page of pages) {
75016
+ for (const block of page["blocks"] ?? []) {
75017
+ if (block.block !== "office" && !Array.isArray(block.props?.["agents"])) continue;
75018
+ block.props = {
75019
+ ...block.props,
75020
+ ...Array.isArray(state["agents"]) ? { agents: state["agents"] } : {},
75021
+ ...Array.isArray(state["tasks"]) ? { tasks: state["tasks"] } : {}
75022
+ };
75023
+ }
75024
+ }
75025
+ }
74607
75026
  async function loadManifest(file2, kind) {
74608
75027
  const raw = await readJson(file2);
74609
75028
  const dir = import_node_path12.default.dirname(file2);
@@ -74627,7 +75046,9 @@ async function loadManifest(file2, kind) {
74627
75046
  } catch {
74628
75047
  }
74629
75048
  }
74630
- return { ...kit, theme, content: { pages: [...files, ...inline] } };
75049
+ const pages = [...files, ...inline];
75050
+ await applyOfficeState(dir, pages);
75051
+ return { ...kit, theme, content: { pages } };
74631
75052
  }
74632
75053
  var announced = /* @__PURE__ */ new Set();
74633
75054
  async function scan(root) {
@@ -74670,7 +75091,8 @@ async function scan(root) {
74670
75091
  }
74671
75092
  var escapeHtml3 = (value) => value.replace(/[&<>"']/g, (c2) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" })[c2]);
74672
75093
  var FRAME_HEAD = `<base target="_blank"><style>${styles_default}</style>`;
74673
- var FRAME_CSP = "default-src 'none'; style-src 'unsafe-inline' https://fonts.googleapis.com; font-src https://fonts.gstatic.com; img-src * data:; base-uri 'self'";
75094
+ var frameCsp = (nonce) => `default-src 'none'; ${nonce ? `script-src 'nonce-${nonce}'; ` : ""}style-src 'unsafe-inline' https://fonts.googleapis.com; font-src https://fonts.gstatic.com; img-src * data:; base-uri 'self'`;
75095
+ var FRAME_CSP = frameCsp();
74674
75096
  var SHELL_CSP = "default-src 'self'; style-src 'unsafe-inline'; frame-ancestors 'none'";
74675
75097
  function send(res, status, type, body, csp) {
74676
75098
  res.writeHead(status, {
@@ -74720,7 +75142,9 @@ async function startDevServer(root, port, exactPort) {
74720
75142
  }
74721
75143
  const manifest = await loadManifest(item.file, item.kind);
74722
75144
  const page = url2.searchParams.get("page") ?? void 0;
74723
- return send(res, 200, "text/html", renderManifestDocument(manifest, { page, head: FRAME_HEAD + (css ? `<style>${css}</style>` : "") }), FRAME_CSP);
75145
+ const nonce = (0, import_node_crypto.randomBytes)(16).toString("hex");
75146
+ const html = renderManifestDocument(manifest, { page, head: FRAME_HEAD + (css ? `<style>${css}</style>` : ""), canvasRuntime: runtime_default, nonce });
75147
+ return send(res, 200, "text/html", html, frameCsp(nonce));
74724
75148
  }
74725
75149
  send(res, 404, "text/plain", "Not found");
74726
75150
  }
@@ -74827,7 +75251,7 @@ function registerDevCommand(program3) {
74827
75251
  }
74828
75252
 
74829
75253
  // src/version.ts
74830
- var VERSION = "0.3.0";
75254
+ var VERSION = "0.4.0";
74831
75255
 
74832
75256
  // src/index.ts
74833
75257
  var program2 = new Command();