@krollins/blueprint 0.1.14 → 0.1.15

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.
@@ -1 +1 @@
1
- {"version":3,"file":"code-block.d.ts","sourceRoot":"","sources":["../../../source/components/code-block/code-block.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAMrE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,aAAa,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC;;;;OAIG;IACH,UAAU,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhC;;;OAGG;IACH,SAAS,CAAC,OAAO,EAAE;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;KAClB,GAAG,eAAe,CAAC;CACrB;AAkBD;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,yBAO9B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBACa,WAAY,SAAQ,UAAU;IACzC;;OAEG;IACiC,IAAI,EAAE,MAAM,CAAC;IAEjD;;;OAGG;IACiC,QAAQ,EAAE,MAAM,CAAC;IAErD;;;OAGG;IACiC,KAAK,EAAE,MAAM,CAAC;IAElD;;OAEG;IAEK,eAAe,EAAE,OAAO,CAAC;IAEjC;;OAEG;IACgC,cAAc,EAAE,MAAM,EAAE,CAAC;IAE5D;;OAEG;IAEK,SAAS,EAAE,OAAO,CAAC;IAE3B;;OAEG;IAEK,cAAc,EAAE,OAAO,CAAC;IAEhC;;OAEG;IAEK,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAErC;;OAEG;IAEK,UAAU,EAAE,OAAO,CAAC;IAE5B;;;OAGG;IAEK,gBAAgB,EAAE,yBAAyB,CAAC;IAEpD;;OAEG;IACH,MAAM,CAAC,cAAc,EAAE,yBAAyB,CAAoB;IAE3D,OAAO,CAAC,UAAU,CAAuC;IACzD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAM;IAC9B,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,iBAAiB,CAAgB;IAElD,OAAO,CAAC,eAAe,CAA8C;IAErE,MAAM,CAAC,MAAM,4BAAqB;;IAgBlC,oBAAoB,IAAI,IAAI;cAQT,UAAU,CAAC,iBAAiB,EAAE,cAAc,GAAG,IAAI;IA2BtE,iBAAiB,IAAI,IAAI;YAKX,kBAAkB;IAmBhC,OAAO,CAAC,uBAAuB;IAkB/B,OAAO,CAAC,WAAW,CAiCjB;IAEF,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,eAAe;IAIvB,OAAO,KAAK,eAAe,GAM1B;IAED,OAAO,KAAK,YAAY,GAEvB;IAED,OAAO,KAAK,YAAY,GAEvB;IAED,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,eAAe;IAyCvB,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,yBAAyB;IAQjC,OAAO,CAAC,WAAW;IA0BnB,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,CAAC,mBAAmB;IAe3B,MAAM;CAwCP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,eAAe,EAAE,WAAW,CAAC;KAC9B;CACF"}
1
+ {"version":3,"file":"code-block.d.ts","sourceRoot":"","sources":["../../../source/components/code-block/code-block.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAMrE;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,aAAa,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC;;;;OAIG;IACH,UAAU,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEhC;;;OAGG;IACH,SAAS,CAAC,OAAO,EAAE;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;KAClB,GAAG,eAAe,CAAC;CACrB;AAkBD;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,yBAO9B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBACa,WAAY,SAAQ,UAAU;IACzC;;OAEG;IACiC,IAAI,EAAE,MAAM,CAAC;IAEjD;;;OAGG;IACiC,QAAQ,EAAE,MAAM,CAAC;IAErD;;;OAGG;IACiC,KAAK,EAAE,MAAM,CAAC;IAElD;;OAEG;IAEK,eAAe,EAAE,OAAO,CAAC;IAEjC;;OAEG;IACgC,cAAc,EAAE,MAAM,EAAE,CAAC;IAE5D;;OAEG;IAEK,SAAS,EAAE,OAAO,CAAC;IAE3B;;OAEG;IAEK,cAAc,EAAE,OAAO,CAAC;IAEhC;;OAEG;IAEK,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAErC;;OAEG;IAEK,UAAU,EAAE,OAAO,CAAC;IAE5B;;;OAGG;IAEK,gBAAgB,EAAE,yBAAyB,CAAC;IAEpD;;OAEG;IACH,MAAM,CAAC,cAAc,EAAE,yBAAyB,CAAoB;IAE3D,OAAO,CAAC,UAAU,CAAuC;IACzD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAM;IAC9B,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,iBAAiB,CAAgB;IAElD,OAAO,CAAC,eAAe,CAA8C;IAErE,MAAM,CAAC,MAAM,4BAAqB;;IAgBlC,oBAAoB,IAAI,IAAI;cAQT,UAAU,CAAC,iBAAiB,EAAE,cAAc,GAAG,IAAI;IA2BtE,iBAAiB,IAAI,IAAI;YAKX,kBAAkB;IAmBhC,OAAO,CAAC,uBAAuB;IAkB/B,OAAO,CAAC,WAAW,CAiCjB;IAEF,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,eAAe;IAIvB,OAAO,KAAK,eAAe,GAM1B;IAED,OAAO,KAAK,YAAY,GAEvB;IAED,OAAO,KAAK,YAAY,GAEvB;IAED,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,eAAe;IAyCvB,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,yBAAyB;IAQjC,OAAO,CAAC,WAAW;IAgCnB,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,mBAAmB;IAe3B,MAAM;CAwCP;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,qBAAqB;QAC7B,eAAe,EAAE,WAAW,CAAC;KAC9B;CACF"}
@@ -1,8 +1,8 @@
1
- import { css as g, LitElement as u, html as r, nothing as c } from "lit";
2
- import { property as a, state as s, customElement as y } from "lit/decorators.js";
3
- import { ifDefined as v } from "lit/directives/if-defined.js";
1
+ import { css as u, LitElement as y, html as r, nothing as d } from "lit";
2
+ import { property as a, state as l, customElement as v } from "lit/decorators.js";
3
+ import { ifDefined as _ } from "lit/directives/if-defined.js";
4
4
  import { unsafeHTML as b } from "lit/directives/unsafe-html.js";
5
- const f = g`
5
+ const f = u`
6
6
  /* Base styles */
7
7
  :host {
8
8
  display: block;
@@ -272,10 +272,10 @@ const f = g`
272
272
  }
273
273
  }
274
274
  `;
275
- var m = Object.defineProperty, k = Object.getOwnPropertyDescriptor, i = (e, o, d, l) => {
276
- for (var n = l > 1 ? void 0 : l ? k(o, d) : o, p = e.length - 1, h; p >= 0; p--)
277
- (h = e[p]) && (n = (l ? h(o, d, n) : h(n)) || n);
278
- return l && n && m(o, d, n), n;
275
+ var m = Object.defineProperty, k = Object.getOwnPropertyDescriptor, i = (e, o, c, s) => {
276
+ for (var n = s > 1 ? void 0 : s ? k(o, c) : o, p = e.length - 1, h; p >= 0; p--)
277
+ (h = e[p]) && (n = (s ? h(o, c, n) : h(n)) || n);
278
+ return s && n && m(o, c, n), n;
279
279
  };
280
280
  const x = {
281
281
  "&": "&",
@@ -284,18 +284,18 @@ const x = {
284
284
  '"': """,
285
285
  "'": "'"
286
286
  };
287
- function _(e) {
287
+ function g(e) {
288
288
  return e.replace(/[&<>"']/g, (o) => x[o] ?? o);
289
289
  }
290
290
  const w = {
291
291
  highlight({ code: e }) {
292
292
  return {
293
- html: _(e),
293
+ html: g(e),
294
294
  isHighlighted: !1
295
295
  };
296
296
  }
297
297
  };
298
- let t = class extends u {
298
+ let t = class extends y {
299
299
  constructor() {
300
300
  super(), this._copyState = "idle", this._expanded = !1, this._highlightedHtml = "", this._adapterContext = void 0, this._adapterInitialized = !1, this._lineCount = 0, this._highlightSet = /* @__PURE__ */ new Set(), this._highlightedLines = [], this._copyResetTimer = null, this._handleCopy = async () => {
301
301
  let e;
@@ -349,7 +349,7 @@ let t = class extends u {
349
349
  });
350
350
  this._highlightedHtml = o.html;
351
351
  } catch {
352
- this._highlightedHtml = _(this.code);
352
+ this._highlightedHtml = g(this.code);
353
353
  }
354
354
  this._highlightedLines = this._highlightedHtml.split(`
355
355
  `);
@@ -425,7 +425,7 @@ let t = class extends u {
425
425
  >
426
426
  ${this._renderCopyIcon()}
427
427
  </button>
428
- ` : c;
428
+ ` : d;
429
429
  }
430
430
  _renderHeader() {
431
431
  return this.showHeader ? r`
@@ -438,44 +438,38 @@ let t = class extends u {
438
438
  ${this._renderCopyButton()}
439
439
  </div>
440
440
  </div>
441
- ` : c;
441
+ ` : d;
442
442
  }
443
443
  _renderFloatingCopyButton() {
444
- return this.showHeader || !this.showCopyButton ? c : r`
444
+ return this.showHeader || !this.showCopyButton ? d : r`
445
445
  <div class="code-block__floating-copy">${this._renderCopyButton()}</div>
446
446
  `;
447
447
  }
448
- _renderLine(e, o, d) {
449
- const l = this._highlightSet.has(o);
450
- return r`
451
- ${d ? r`<span
448
+ _renderLine(e, o, c) {
449
+ const s = this._highlightSet.has(o);
450
+ return c ? r`<span
452
451
  part="line-number"
453
452
  class="code-block__line-number"
454
453
  aria-hidden="true"
455
454
  >${o}</span
456
- >` : c}
457
- <span
458
- part="line"
459
- class="code-block__line ${l ? "code-block__line--highlighted" : ""}"
460
- aria-current=${v(l ? "true" : void 0)}
461
- >${b(e)}</span
462
- >
463
- `;
455
+ ><span
456
+ part="line"
457
+ class="code-block__line ${s ? "code-block__line--highlighted" : ""}"
458
+ aria-current=${_(s ? "true" : void 0)}
459
+ >${b(e)}</span
460
+ >` : r`<span
461
+ part="line"
462
+ class="code-block__line ${s ? "code-block__line--highlighted" : ""}"
463
+ aria-current=${_(s ? "true" : void 0)}
464
+ >${b(e)}</span
465
+ >`;
464
466
  }
465
467
  _renderCodeLines() {
466
- return this.showLineNumbers ? r`
467
- <div class="code-block__lines">
468
- ${this._highlightedLines.map(
468
+ return this.showLineNumbers ? r`<div class="code-block__lines">${this._highlightedLines.map(
469
469
  (e, o) => this._renderLine(e, o + 1, !0)
470
- )}
471
- </div>
472
- ` : this.highlightLines.length > 0 ? r`
473
- <div class="code-block__lines code-block__lines--no-gutter">
474
- ${this._highlightedLines.map(
470
+ )}</div>` : this.highlightLines.length > 0 ? r`<div class="code-block__lines code-block__lines--no-gutter">${this._highlightedLines.map(
475
471
  (e, o) => this._renderLine(e, o + 1, !1)
476
- )}
477
- </div>
478
- ` : b(this._highlightedHtml);
472
+ )}</div>` : b(this._highlightedHtml);
479
473
  }
480
474
  _renderExpandButton() {
481
475
  return this._shouldCollapse ? r`
@@ -487,7 +481,7 @@ let t = class extends u {
487
481
  >
488
482
  ${this._expanded ? "Show less" : "Show more"}
489
483
  </button>
490
- ` : c;
484
+ ` : d;
491
485
  }
492
486
  render() {
493
487
  const e = [
@@ -510,7 +504,7 @@ let t = class extends u {
510
504
  part="pre"
511
505
  class="code-block__pre"
512
506
  ><code part="code" class="code-block__code">${this._renderCodeLines()}</code></pre>
513
- ${this._isCollapsed ? r`<div class="code-block__gradient"></div>` : c}
507
+ ${this._isCollapsed ? r`<div class="code-block__gradient"></div>` : d}
514
508
  </div>
515
509
  ${this._renderExpandButton()}
516
510
  <div class="code-block__status" role="status" aria-live="polite">
@@ -554,31 +548,31 @@ i([
554
548
  a({ attribute: !1 })
555
549
  ], t.prototype, "highlightAdapter", 2);
556
550
  i([
557
- s()
551
+ l()
558
552
  ], t.prototype, "_copyState", 2);
559
553
  i([
560
- s()
554
+ l()
561
555
  ], t.prototype, "_expanded", 2);
562
556
  i([
563
- s()
557
+ l()
564
558
  ], t.prototype, "_highlightedHtml", 2);
565
559
  i([
566
- s()
560
+ l()
567
561
  ], t.prototype, "_adapterContext", 2);
568
562
  i([
569
- s()
563
+ l()
570
564
  ], t.prototype, "_adapterInitialized", 2);
571
565
  i([
572
- s()
566
+ l()
573
567
  ], t.prototype, "_lineCount", 2);
574
568
  i([
575
- s()
569
+ l()
576
570
  ], t.prototype, "_highlightSet", 2);
577
571
  i([
578
- s()
572
+ l()
579
573
  ], t.prototype, "_highlightedLines", 2);
580
574
  t = i([
581
- y("bp-code-block")
575
+ v("bp-code-block")
582
576
  ], t);
583
577
  export {
584
578
  t as BpCodeBlock,
@@ -1 +1 @@
1
- {"version":3,"file":"code-block.js","sources":["../../source/components/code-block/code-block.style.ts","../../source/components/code-block/code-block.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const codeBlockStyles = css`\n /* Base styles */\n :host {\n display: block;\n container-type: inline-size;\n }\n\n .code-block {\n position: relative;\n border: var(--bp-border-width) solid var(--bp-color-border);\n border-radius: var(--bp-border-radius-lg);\n overflow: hidden;\n background-color: var(--bp-color-surface);\n font-family: var(--bp-font-family-mono);\n font-size: var(--bp-font-size-sm);\n line-height: var(--bp-line-height-relaxed);\n }\n\n /* Header */\n .code-block__header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--bp-spacing-sm);\n padding: var(--bp-spacing-xs) var(--bp-spacing-md);\n background-color: var(--bp-color-surface-elevated);\n border-bottom: var(--bp-border-width) solid var(--bp-color-border);\n min-height: var(--bp-spacing-10);\n }\n\n .code-block__title {\n font-family: var(--bp-font-family);\n font-size: var(--bp-font-size-xs);\n font-weight: var(--bp-font-weight-medium);\n color: var(--bp-color-text-muted);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n min-width: 0;\n text-transform: uppercase;\n letter-spacing: 0.05em; /* Intentional one-off for header label readability */\n }\n\n .code-block__controls {\n display: flex;\n align-items: center;\n gap: var(--bp-spacing-xs);\n flex-shrink: 0;\n }\n\n /* Copy button */\n .code-block__copy {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: none;\n border: none;\n padding: var(--bp-spacing-2xs);\n border-radius: var(--bp-border-radius-md);\n color: var(--bp-color-text-muted);\n cursor: pointer;\n transition:\n color var(--bp-transition-fast),\n background-color var(--bp-transition-fast);\n }\n\n .code-block__copy:hover {\n color: var(--bp-color-text);\n background-color: var(--bp-color-hover-overlay);\n }\n\n .code-block__copy:active {\n background-color: var(--bp-color-active-overlay);\n }\n\n .code-block__copy:focus-visible {\n outline: var(--bp-focus-ring);\n outline-offset: var(--bp-focus-offset);\n }\n\n .code-block__copy--copied {\n color: var(--bp-color-success);\n }\n\n .code-block__copy--error {\n color: var(--bp-color-error);\n }\n\n .code-block__icon {\n width: var(--bp-icon-size-sm);\n height: var(--bp-icon-size-sm);\n }\n\n /* Floating copy button (when header is hidden) */\n .code-block__floating-copy {\n position: absolute;\n top: var(--bp-spacing-xs);\n right: var(--bp-spacing-xs);\n z-index: var(--bp-z-base);\n opacity: 0;\n transition: opacity var(--bp-transition-fast);\n }\n\n .code-block__body:hover .code-block__floating-copy,\n .code-block__body:focus-within .code-block__floating-copy {\n opacity: 1;\n }\n\n /* Ensure floating copy button is reachable on touch devices (no hover) */\n @media (hover: none) {\n .code-block__floating-copy {\n opacity: 0.7;\n }\n }\n\n .code-block__floating-copy .code-block__copy {\n background-color: var(--bp-color-surface-elevated);\n border: var(--bp-border-width) solid var(--bp-color-border);\n box-shadow: var(--bp-shadow-sm);\n }\n\n /* Body */\n .code-block__body {\n position: relative;\n overflow: hidden;\n }\n\n .code-block__body--scroll {\n overflow-x: auto;\n }\n\n /* Pre / Code */\n .code-block__pre {\n margin: 0;\n padding: var(--bp-spacing-md);\n overflow: visible;\n }\n\n .code-block__body--wrap .code-block__pre {\n white-space: pre-wrap;\n word-break: break-all;\n overflow-wrap: break-word;\n }\n\n .code-block__body--scroll .code-block__pre {\n white-space: pre;\n overflow-x: auto;\n }\n\n .code-block__code {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n color: var(--bp-color-text);\n }\n\n /* Line numbers grid layout */\n .code-block__lines {\n display: grid;\n grid-template-columns: auto 1fr;\n }\n\n .code-block__lines--no-gutter {\n grid-template-columns: 1fr;\n }\n\n .code-block__line-number {\n align-self: start;\n text-align: right;\n padding-right: var(--bp-spacing-md);\n color: var(--bp-color-text-muted);\n user-select: none;\n min-width: var(--bp-spacing-8);\n opacity: var(--bp-opacity-subtle);\n }\n\n .code-block__line {\n display: block;\n padding-left: var(--bp-spacing-2xs);\n border-left: var(--bp-spacing-0-5) solid transparent;\n }\n\n .code-block__line--highlighted {\n background-color: var(--bp-color-selected-bg);\n border-left-color: var(--bp-color-primary);\n }\n\n /* Collapsed / expand */\n /* max-height = (line count × line-height × font-size) + vertical padding */\n .code-block__body--collapsed {\n max-height: calc(\n var(--_max-lines, 10) * var(--bp-line-height-relaxed) * 1em +\n var(--bp-spacing-md) * 2\n );\n overflow: hidden;\n }\n\n .code-block__gradient {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n height: var(--bp-spacing-16);\n background: linear-gradient(transparent, var(--bp-color-surface));\n pointer-events: none;\n }\n\n .code-block__expand {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n padding: var(--bp-spacing-xs) var(--bp-spacing-md);\n background: none;\n border: none;\n border-top: var(--bp-border-width) solid var(--bp-color-border);\n color: var(--bp-color-primary);\n font-family: var(--bp-font-family);\n font-size: var(--bp-font-size-xs);\n font-weight: var(--bp-font-weight-medium);\n cursor: pointer;\n transition: background-color var(--bp-transition-fast);\n }\n\n .code-block__expand:hover {\n background-color: var(--bp-color-hover-overlay);\n }\n\n .code-block__expand:active {\n background-color: var(--bp-color-active-overlay);\n }\n\n .code-block__expand:focus-visible {\n outline: var(--bp-focus-ring);\n outline-offset: calc(-1 * var(--bp-focus-offset));\n }\n\n /* Visually hidden status for screen readers.\n Uses --bp-spacing-0-5 (2px) instead of the typical 1px sr-only pattern\n to stay consistent with design tokens throughout. */\n .code-block__status {\n position: absolute;\n width: var(--bp-spacing-0-5);\n height: var(--bp-spacing-0-5);\n padding: var(--bp-spacing-0);\n margin: calc(-1 * var(--bp-spacing-0-5));\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: var(--bp-spacing-0);\n }\n\n /* Container queries for responsive behavior */\n @container (max-width: 480px) {\n /* stylelint-disable-line -- container queries cannot use var() */\n .code-block__header {\n flex-wrap: wrap;\n }\n\n .code-block__pre {\n padding: var(--bp-spacing-sm);\n font-size: var(--bp-font-size-xs);\n }\n\n .code-block__line-number {\n min-width: var(--bp-spacing-6);\n padding-right: var(--bp-spacing-sm);\n }\n }\n`;\n","import { LitElement, html, nothing, type PropertyValues } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\nimport { codeBlockStyles } from './code-block.style.js';\n\n/**\n * Result returned by a highlight adapter.\n */\nexport interface HighlightResult {\n /** The highlighted code as an HTML string. */\n html: string;\n /** Whether highlighting was actually applied (false = plain text fallback). */\n isHighlighted: boolean;\n}\n\n/**\n * Adapter interface for pluggable syntax highlighting.\n */\nexport interface CodeBlockHighlightAdapter {\n /**\n * Called once when the adapter is first used.\n * Use this for async initialization (loading Shiki, registering languages, etc).\n * Return value is passed to `highlight()` as context.\n */\n initialize?(): Promise<unknown>;\n\n /**\n * Return highlighted HTML for the given code and language.\n * `context` is the resolved value from `initialize()`.\n */\n highlight(options: {\n code: string;\n language: string;\n context: unknown;\n }): HighlightResult;\n}\n\n/** Maps HTML special characters to their entity equivalents for XSS prevention. */\nconst htmlEscapeMap: Record<string, string> = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#039;',\n};\n\n/**\n * Escapes HTML special characters in a single pass to prevent XSS when rendering plain text.\n */\nfunction escapeHtml(text: string): string {\n return text.replace(/[&<>\"']/g, (char) => htmlEscapeMap[char] ?? char);\n}\n\n/**\n * Built-in plain text adapter that escapes HTML and renders monospace text.\n * Zero dependencies, zero bundle cost.\n */\nexport const plainTextAdapter: CodeBlockHighlightAdapter = {\n highlight({ code }) {\n return {\n html: escapeHtml(code),\n isHighlighted: false,\n };\n },\n};\n\n/**\n * A code block component for displaying syntax-highlighted code with\n * copy-to-clipboard, line numbers, line highlighting, and expand/collapse.\n *\n * @slot title - Custom title content. Overrides the `title` attribute.\n * @slot controls - Additional control buttons placed before the copy button.\n * @slot copy-icon - Custom icon for the copy button (default state).\n * @slot copied-icon - Custom icon for the copy button (success state).\n *\n * @fires bp-copy - Fired after a copy attempt. Detail: `{ code: string, success: boolean }`\n *\n * @csspart base - Outer wrapper\n * @csspart header - Header bar\n * @csspart title - Title text area\n * @csspart controls - Controls container\n * @csspart copy-button - The copy button\n * @csspart body - Scrollable code container\n * @csspart pre - The `<pre>` element\n * @csspart code - The `<code>` element\n * @csspart line-number - Individual line number cell\n * @csspart line - Individual line of code\n */\n@customElement('bp-code-block')\nexport class BpCodeBlock extends LitElement {\n /**\n * The source code to display.\n */\n @property({ type: String }) declare code: string;\n\n /**\n * Language identifier for syntax highlighting (e.g. 'typescript', 'html', 'python').\n * Also displayed as a label when no title is set.\n */\n @property({ type: String }) declare language: string;\n\n /**\n * Optional title displayed in the header (e.g. a filename like `index.ts`).\n * Overrides the language label.\n */\n @property({ type: String }) declare title: string;\n\n /**\n * Show line number gutter.\n */\n @property({ type: Boolean, attribute: 'show-line-numbers', reflect: true })\n declare showLineNumbers: boolean;\n\n /**\n * Array of 1-based line numbers to visually highlight.\n */\n @property({ type: Array }) declare highlightLines: number[];\n\n /**\n * Wrap long lines instead of horizontal scroll.\n */\n @property({ type: Boolean, attribute: 'wrap-lines', reflect: true })\n declare wrapLines: boolean;\n\n /**\n * Show the copy-to-clipboard button.\n */\n @property({ type: Boolean, attribute: 'show-copy-button', reflect: true })\n declare showCopyButton: boolean;\n\n /**\n * When set, collapse the code block to this many visible lines with a \"Show more\" toggle.\n */\n @property({ type: Number, attribute: 'max-lines' })\n declare maxLines: number | undefined;\n\n /**\n * Show/hide the header bar. When false, the copy button floats over the code.\n */\n @property({ type: Boolean, attribute: 'show-header', reflect: true })\n declare showHeader: boolean;\n\n /**\n * The syntax highlight adapter to use for this instance.\n * Defaults to `BpCodeBlock.defaultAdapter` which is the plainTextAdapter.\n */\n @property({ attribute: false })\n declare highlightAdapter: CodeBlockHighlightAdapter;\n\n /**\n * Global default adapter used when no per-instance adapter is set.\n */\n static defaultAdapter: CodeBlockHighlightAdapter = plainTextAdapter;\n\n @state() private _copyState: 'idle' | 'copied' | 'error' = 'idle';\n @state() private _expanded = false;\n @state() private _highlightedHtml = '';\n @state() private _adapterContext: unknown = undefined;\n @state() private _adapterInitialized = false;\n @state() private _lineCount = 0;\n @state() private _highlightSet: Set<number> = new Set();\n @state() private _highlightedLines: string[] = [];\n\n private _copyResetTimer: ReturnType<typeof setTimeout> | null = null;\n\n static styles = [codeBlockStyles];\n\n constructor() {\n super();\n this.code = '';\n this.language = 'text';\n this.title = '';\n this.showLineNumbers = false;\n this.highlightLines = [];\n this.wrapLines = true;\n this.showCopyButton = true;\n this.maxLines = undefined;\n this.showHeader = true;\n this.highlightAdapter = BpCodeBlock.defaultAdapter;\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n if (this._copyResetTimer) {\n clearTimeout(this._copyResetTimer);\n this._copyResetTimer = null;\n }\n }\n\n protected override willUpdate(changedProperties: PropertyValues): void {\n super.willUpdate(changedProperties);\n\n if (changedProperties.has('highlightAdapter')) {\n this._adapterInitialized = false;\n this._adapterContext = undefined;\n this._initializeAdapter();\n }\n\n if (changedProperties.has('code')) {\n this._lineCount = this.code.split('\\n').length;\n }\n\n if (changedProperties.has('highlightLines')) {\n this._highlightSet = new Set(this.highlightLines);\n }\n\n const needsRehighlight =\n changedProperties.has('code') ||\n changedProperties.has('language') ||\n changedProperties.has('highlightAdapter');\n\n if (needsRehighlight) {\n this._updateHighlightingSync();\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this._initializeAdapter();\n }\n\n private async _initializeAdapter(): Promise<void> {\n const adapter = this.highlightAdapter;\n if (!this._adapterInitialized && adapter.initialize) {\n try {\n const context = await adapter.initialize();\n // Bail if adapter changed while awaiting\n if (this.highlightAdapter !== adapter) return;\n this._adapterContext = context;\n } catch {\n if (this.highlightAdapter !== adapter) return;\n this._adapterContext = undefined;\n }\n this._adapterInitialized = true;\n // Re-highlight with context after async init\n this._updateHighlightingSync();\n this.requestUpdate();\n }\n }\n\n private _updateHighlightingSync(): void {\n const adapter = this.highlightAdapter;\n\n try {\n const result = adapter.highlight({\n code: this.code,\n language: this.language,\n context: this._adapterContext,\n });\n this._highlightedHtml = result.html;\n } catch {\n // Fallback to plain text on adapter error\n this._highlightedHtml = escapeHtml(this.code);\n }\n\n this._highlightedLines = this._highlightedHtml.split('\\n');\n }\n\n private _handleCopy = async (): Promise<void> => {\n let success: boolean;\n\n try {\n if (navigator.clipboard) {\n await navigator.clipboard.writeText(this.code);\n success = true;\n } else {\n // Fallback for insecure contexts\n success = this._fallbackCopy();\n }\n } catch {\n success = this._fallbackCopy();\n }\n\n this._copyState = success ? 'copied' : 'error';\n\n this.dispatchEvent(\n new CustomEvent('bp-copy', {\n detail: { code: this.code, success },\n bubbles: true,\n composed: true,\n })\n );\n\n // Reset after 2 seconds\n if (this._copyResetTimer) {\n clearTimeout(this._copyResetTimer);\n }\n this._copyResetTimer = setTimeout(() => {\n this._copyState = 'idle';\n this._copyResetTimer = null;\n }, 2000);\n };\n\n private _fallbackCopy(): boolean {\n try {\n const textarea = document.createElement('textarea');\n textarea.value = this.code;\n textarea.style.position = 'fixed';\n textarea.style.left = '-9999px';\n textarea.style.top = '-9999px';\n document.body.appendChild(textarea);\n textarea.select();\n const result = document.execCommand('copy');\n document.body.removeChild(textarea);\n return result;\n } catch {\n return false;\n }\n }\n\n private _toggleExpanded(): void {\n this._expanded = !this._expanded;\n }\n\n private get _shouldCollapse(): boolean {\n return (\n this.maxLines !== undefined &&\n this.maxLines > 0 &&\n this._lineCount > this.maxLines\n );\n }\n\n private get _isCollapsed(): boolean {\n return this._shouldCollapse && !this._expanded;\n }\n\n private get _headerLabel(): string {\n return this.title || this.language;\n }\n\n private _getCopyAriaLabel(): string {\n if (this._copyState === 'copied') return 'Copied!';\n if (this._copyState === 'error') return 'Failed to copy';\n return 'Copy code';\n }\n\n private _renderCopyIcon() {\n if (this._copyState === 'copied') {\n return html`\n <slot name=\"copied-icon\">\n <svg\n class=\"code-block__icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"20 6 9 17 4 12\"></polyline>\n </svg>\n </slot>\n `;\n }\n\n return html`\n <slot name=\"copy-icon\">\n <svg\n class=\"code-block__icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect>\n <path\n d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\n ></path>\n </svg>\n </slot>\n `;\n }\n\n private _renderCopyButton() {\n if (!this.showCopyButton) return nothing;\n\n return html`\n <button\n part=\"copy-button\"\n class=\"code-block__copy code-block__copy--${this._copyState}\"\n aria-label=${this._getCopyAriaLabel()}\n @click=${this._handleCopy}\n >\n ${this._renderCopyIcon()}\n </button>\n `;\n }\n\n private _renderHeader() {\n if (!this.showHeader) return nothing;\n\n return html`\n <div part=\"header\" class=\"code-block__header\">\n <span part=\"title\" class=\"code-block__title\">\n <slot name=\"title\">${this._headerLabel}</slot>\n </span>\n <div part=\"controls\" class=\"code-block__controls\">\n <slot name=\"controls\"></slot>\n ${this._renderCopyButton()}\n </div>\n </div>\n `;\n }\n\n private _renderFloatingCopyButton() {\n if (this.showHeader || !this.showCopyButton) return nothing;\n\n return html`\n <div class=\"code-block__floating-copy\">${this._renderCopyButton()}</div>\n `;\n }\n\n private _renderLine(\n lineHtml: string,\n lineNumber: number,\n showNumber: boolean\n ) {\n const isHighlighted = this._highlightSet.has(lineNumber);\n return html`\n ${showNumber\n ? html`<span\n part=\"line-number\"\n class=\"code-block__line-number\"\n aria-hidden=\"true\"\n >${lineNumber}</span\n >`\n : nothing}\n <span\n part=\"line\"\n class=\"code-block__line ${isHighlighted\n ? 'code-block__line--highlighted'\n : ''}\"\n aria-current=${ifDefined(isHighlighted ? 'true' : undefined)}\n >${unsafeHTML(lineHtml)}</span\n >\n `;\n }\n\n private _renderCodeLines() {\n if (this.showLineNumbers) {\n return html`\n <div class=\"code-block__lines\">\n ${this._highlightedLines.map((lineHtml, index) =>\n this._renderLine(lineHtml, index + 1, true)\n )}\n </div>\n `;\n }\n\n if (this.highlightLines.length > 0) {\n return html`\n <div class=\"code-block__lines code-block__lines--no-gutter\">\n ${this._highlightedLines.map((lineHtml, index) =>\n this._renderLine(lineHtml, index + 1, false)\n )}\n </div>\n `;\n }\n\n return unsafeHTML(this._highlightedHtml);\n }\n\n private _renderExpandButton() {\n if (!this._shouldCollapse) return nothing;\n\n return html`\n <button\n part=\"expand-button\"\n class=\"code-block__expand\"\n @click=${this._toggleExpanded}\n aria-expanded=${this._expanded}\n >\n ${this._expanded ? 'Show less' : 'Show more'}\n </button>\n `;\n }\n\n render() {\n const bodyClasses = [\n 'code-block__body',\n this.wrapLines ? 'code-block__body--wrap' : 'code-block__body--scroll',\n this._isCollapsed ? 'code-block__body--collapsed' : '',\n ]\n .filter(Boolean)\n .join(' ');\n\n return html`\n <div\n part=\"base\"\n class=\"code-block\"\n role=\"region\"\n aria-label=${this.title\n ? `Code example: ${this.title}`\n : 'Code example'}\n style=${this._isCollapsed && this.maxLines\n ? `--_max-lines: ${this.maxLines}`\n : ''}\n >\n ${this._renderHeader()}\n <div part=\"body\" class=${bodyClasses}>\n ${this._renderFloatingCopyButton()}\n <pre\n part=\"pre\"\n class=\"code-block__pre\"\n ><code part=\"code\" class=\"code-block__code\">${this._renderCodeLines()}</code></pre>\n ${this._isCollapsed\n ? html`<div class=\"code-block__gradient\"></div>`\n : nothing}\n </div>\n ${this._renderExpandButton()}\n <div class=\"code-block__status\" role=\"status\" aria-live=\"polite\">\n ${this._copyState === 'copied' ? 'Copied to clipboard' : ''}\n ${this._copyState === 'error' ? 'Failed to copy' : ''}\n </div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'bp-code-block': BpCodeBlock;\n }\n}\n"],"names":["codeBlockStyles","css","htmlEscapeMap","escapeHtml","text","char","plainTextAdapter","code","BpCodeBlock","LitElement","success","changedProperties","adapter","context","result","textarea","html","nothing","lineHtml","lineNumber","showNumber","isHighlighted","ifDefined","unsafeHTML","index","bodyClasses","__decorateClass","property","state","customElement"],"mappings":";;;;AAEO,MAAMA,IAAkBC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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"}
1
+ {"version":3,"file":"code-block.js","sources":["../../source/components/code-block/code-block.style.ts","../../source/components/code-block/code-block.ts"],"sourcesContent":["import { css } from 'lit';\r\n\r\nexport const codeBlockStyles = css`\r\n /* Base styles */\r\n :host {\r\n display: block;\r\n container-type: inline-size;\r\n }\r\n\r\n .code-block {\r\n position: relative;\r\n border: var(--bp-border-width) solid var(--bp-color-border);\r\n border-radius: var(--bp-border-radius-lg);\r\n overflow: hidden;\r\n background-color: var(--bp-color-surface);\r\n font-family: var(--bp-font-family-mono);\r\n font-size: var(--bp-font-size-sm);\r\n line-height: var(--bp-line-height-relaxed);\r\n }\r\n\r\n /* Header */\r\n .code-block__header {\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n gap: var(--bp-spacing-sm);\r\n padding: var(--bp-spacing-xs) var(--bp-spacing-md);\r\n background-color: var(--bp-color-surface-elevated);\r\n border-bottom: var(--bp-border-width) solid var(--bp-color-border);\r\n min-height: var(--bp-spacing-10);\r\n }\r\n\r\n .code-block__title {\r\n font-family: var(--bp-font-family);\r\n font-size: var(--bp-font-size-xs);\r\n font-weight: var(--bp-font-weight-medium);\r\n color: var(--bp-color-text-muted);\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n min-width: 0;\r\n text-transform: uppercase;\r\n letter-spacing: 0.05em; /* Intentional one-off for header label readability */\r\n }\r\n\r\n .code-block__controls {\r\n display: flex;\r\n align-items: center;\r\n gap: var(--bp-spacing-xs);\r\n flex-shrink: 0;\r\n }\r\n\r\n /* Copy button */\r\n .code-block__copy {\r\n display: inline-flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: none;\r\n border: none;\r\n padding: var(--bp-spacing-2xs);\r\n border-radius: var(--bp-border-radius-md);\r\n color: var(--bp-color-text-muted);\r\n cursor: pointer;\r\n transition:\r\n color var(--bp-transition-fast),\r\n background-color var(--bp-transition-fast);\r\n }\r\n\r\n .code-block__copy:hover {\r\n color: var(--bp-color-text);\r\n background-color: var(--bp-color-hover-overlay);\r\n }\r\n\r\n .code-block__copy:active {\r\n background-color: var(--bp-color-active-overlay);\r\n }\r\n\r\n .code-block__copy:focus-visible {\r\n outline: var(--bp-focus-ring);\r\n outline-offset: var(--bp-focus-offset);\r\n }\r\n\r\n .code-block__copy--copied {\r\n color: var(--bp-color-success);\r\n }\r\n\r\n .code-block__copy--error {\r\n color: var(--bp-color-error);\r\n }\r\n\r\n .code-block__icon {\r\n width: var(--bp-icon-size-sm);\r\n height: var(--bp-icon-size-sm);\r\n }\r\n\r\n /* Floating copy button (when header is hidden) */\r\n .code-block__floating-copy {\r\n position: absolute;\r\n top: var(--bp-spacing-xs);\r\n right: var(--bp-spacing-xs);\r\n z-index: var(--bp-z-base);\r\n opacity: 0;\r\n transition: opacity var(--bp-transition-fast);\r\n }\r\n\r\n .code-block__body:hover .code-block__floating-copy,\r\n .code-block__body:focus-within .code-block__floating-copy {\r\n opacity: 1;\r\n }\r\n\r\n /* Ensure floating copy button is reachable on touch devices (no hover) */\r\n @media (hover: none) {\r\n .code-block__floating-copy {\r\n opacity: 0.7;\r\n }\r\n }\r\n\r\n .code-block__floating-copy .code-block__copy {\r\n background-color: var(--bp-color-surface-elevated);\r\n border: var(--bp-border-width) solid var(--bp-color-border);\r\n box-shadow: var(--bp-shadow-sm);\r\n }\r\n\r\n /* Body */\r\n .code-block__body {\r\n position: relative;\r\n overflow: hidden;\r\n }\r\n\r\n .code-block__body--scroll {\r\n overflow-x: auto;\r\n }\r\n\r\n /* Pre / Code */\r\n .code-block__pre {\r\n margin: 0;\r\n padding: var(--bp-spacing-md);\r\n overflow: visible;\r\n }\r\n\r\n .code-block__body--wrap .code-block__pre {\r\n white-space: pre-wrap;\r\n word-break: break-all;\r\n overflow-wrap: break-word;\r\n }\r\n\r\n .code-block__body--scroll .code-block__pre {\r\n white-space: pre;\r\n overflow-x: auto;\r\n }\r\n\r\n .code-block__code {\r\n font-family: inherit;\r\n font-size: inherit;\r\n line-height: inherit;\r\n color: var(--bp-color-text);\r\n }\r\n\r\n /* Line numbers grid layout */\r\n .code-block__lines {\r\n display: grid;\r\n grid-template-columns: auto 1fr;\r\n }\r\n\r\n .code-block__lines--no-gutter {\r\n grid-template-columns: 1fr;\r\n }\r\n\r\n .code-block__line-number {\r\n align-self: start;\r\n text-align: right;\r\n padding-right: var(--bp-spacing-md);\r\n color: var(--bp-color-text-muted);\r\n user-select: none;\r\n min-width: var(--bp-spacing-8);\r\n opacity: var(--bp-opacity-subtle);\r\n }\r\n\r\n .code-block__line {\r\n display: block;\r\n padding-left: var(--bp-spacing-2xs);\r\n border-left: var(--bp-spacing-0-5) solid transparent;\r\n }\r\n\r\n .code-block__line--highlighted {\r\n background-color: var(--bp-color-selected-bg);\r\n border-left-color: var(--bp-color-primary);\r\n }\r\n\r\n /* Collapsed / expand */\r\n /* max-height = (line count × line-height × font-size) + vertical padding */\r\n .code-block__body--collapsed {\r\n max-height: calc(\r\n var(--_max-lines, 10) * var(--bp-line-height-relaxed) * 1em +\r\n var(--bp-spacing-md) * 2\r\n );\r\n overflow: hidden;\r\n }\r\n\r\n .code-block__gradient {\r\n position: absolute;\r\n bottom: 0;\r\n left: 0;\r\n right: 0;\r\n height: var(--bp-spacing-16);\r\n background: linear-gradient(transparent, var(--bp-color-surface));\r\n pointer-events: none;\r\n }\r\n\r\n .code-block__expand {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 100%;\r\n padding: var(--bp-spacing-xs) var(--bp-spacing-md);\r\n background: none;\r\n border: none;\r\n border-top: var(--bp-border-width) solid var(--bp-color-border);\r\n color: var(--bp-color-primary);\r\n font-family: var(--bp-font-family);\r\n font-size: var(--bp-font-size-xs);\r\n font-weight: var(--bp-font-weight-medium);\r\n cursor: pointer;\r\n transition: background-color var(--bp-transition-fast);\r\n }\r\n\r\n .code-block__expand:hover {\r\n background-color: var(--bp-color-hover-overlay);\r\n }\r\n\r\n .code-block__expand:active {\r\n background-color: var(--bp-color-active-overlay);\r\n }\r\n\r\n .code-block__expand:focus-visible {\r\n outline: var(--bp-focus-ring);\r\n outline-offset: calc(-1 * var(--bp-focus-offset));\r\n }\r\n\r\n /* Visually hidden status for screen readers.\r\n Uses --bp-spacing-0-5 (2px) instead of the typical 1px sr-only pattern\r\n to stay consistent with design tokens throughout. */\r\n .code-block__status {\r\n position: absolute;\r\n width: var(--bp-spacing-0-5);\r\n height: var(--bp-spacing-0-5);\r\n padding: var(--bp-spacing-0);\r\n margin: calc(-1 * var(--bp-spacing-0-5));\r\n overflow: hidden;\r\n clip: rect(0, 0, 0, 0);\r\n white-space: nowrap;\r\n border: var(--bp-spacing-0);\r\n }\r\n\r\n /* Container queries for responsive behavior */\r\n @container (max-width: 480px) {\r\n /* stylelint-disable-line -- container queries cannot use var() */\r\n .code-block__header {\r\n flex-wrap: wrap;\r\n }\r\n\r\n .code-block__pre {\r\n padding: var(--bp-spacing-sm);\r\n font-size: var(--bp-font-size-xs);\r\n }\r\n\r\n .code-block__line-number {\r\n min-width: var(--bp-spacing-6);\r\n padding-right: var(--bp-spacing-sm);\r\n }\r\n }\r\n`;\r\n","import { LitElement, html, nothing, type PropertyValues } from 'lit';\r\nimport { customElement, property, state } from 'lit/decorators.js';\r\nimport { ifDefined } from 'lit/directives/if-defined.js';\r\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\r\nimport { codeBlockStyles } from './code-block.style.js';\r\n\r\n/**\r\n * Result returned by a highlight adapter.\r\n */\r\nexport interface HighlightResult {\r\n /** The highlighted code as an HTML string. */\r\n html: string;\r\n /** Whether highlighting was actually applied (false = plain text fallback). */\r\n isHighlighted: boolean;\r\n}\r\n\r\n/**\r\n * Adapter interface for pluggable syntax highlighting.\r\n */\r\nexport interface CodeBlockHighlightAdapter {\r\n /**\r\n * Called once when the adapter is first used.\r\n * Use this for async initialization (loading Shiki, registering languages, etc).\r\n * Return value is passed to `highlight()` as context.\r\n */\r\n initialize?(): Promise<unknown>;\r\n\r\n /**\r\n * Return highlighted HTML for the given code and language.\r\n * `context` is the resolved value from `initialize()`.\r\n */\r\n highlight(options: {\r\n code: string;\r\n language: string;\r\n context: unknown;\r\n }): HighlightResult;\r\n}\r\n\r\n/** Maps HTML special characters to their entity equivalents for XSS prevention. */\r\nconst htmlEscapeMap: Record<string, string> = {\r\n '&': '&amp;',\r\n '<': '&lt;',\r\n '>': '&gt;',\r\n '\"': '&quot;',\r\n \"'\": '&#039;',\r\n};\r\n\r\n/**\r\n * Escapes HTML special characters in a single pass to prevent XSS when rendering plain text.\r\n */\r\nfunction escapeHtml(text: string): string {\r\n return text.replace(/[&<>\"']/g, (char) => htmlEscapeMap[char] ?? char);\r\n}\r\n\r\n/**\r\n * Built-in plain text adapter that escapes HTML and renders monospace text.\r\n * Zero dependencies, zero bundle cost.\r\n */\r\nexport const plainTextAdapter: CodeBlockHighlightAdapter = {\r\n highlight({ code }) {\r\n return {\r\n html: escapeHtml(code),\r\n isHighlighted: false,\r\n };\r\n },\r\n};\r\n\r\n/**\r\n * A code block component for displaying syntax-highlighted code with\r\n * copy-to-clipboard, line numbers, line highlighting, and expand/collapse.\r\n *\r\n * @slot title - Custom title content. Overrides the `title` attribute.\r\n * @slot controls - Additional control buttons placed before the copy button.\r\n * @slot copy-icon - Custom icon for the copy button (default state).\r\n * @slot copied-icon - Custom icon for the copy button (success state).\r\n *\r\n * @fires bp-copy - Fired after a copy attempt. Detail: `{ code: string, success: boolean }`\r\n *\r\n * @csspart base - Outer wrapper\r\n * @csspart header - Header bar\r\n * @csspart title - Title text area\r\n * @csspart controls - Controls container\r\n * @csspart copy-button - The copy button\r\n * @csspart body - Scrollable code container\r\n * @csspart pre - The `<pre>` element\r\n * @csspart code - The `<code>` element\r\n * @csspart line-number - Individual line number cell\r\n * @csspart line - Individual line of code\r\n */\r\n@customElement('bp-code-block')\r\nexport class BpCodeBlock extends LitElement {\r\n /**\r\n * The source code to display.\r\n */\r\n @property({ type: String }) declare code: string;\r\n\r\n /**\r\n * Language identifier for syntax highlighting (e.g. 'typescript', 'html', 'python').\r\n * Also displayed as a label when no title is set.\r\n */\r\n @property({ type: String }) declare language: string;\r\n\r\n /**\r\n * Optional title displayed in the header (e.g. a filename like `index.ts`).\r\n * Overrides the language label.\r\n */\r\n @property({ type: String }) declare title: string;\r\n\r\n /**\r\n * Show line number gutter.\r\n */\r\n @property({ type: Boolean, attribute: 'show-line-numbers', reflect: true })\r\n declare showLineNumbers: boolean;\r\n\r\n /**\r\n * Array of 1-based line numbers to visually highlight.\r\n */\r\n @property({ type: Array }) declare highlightLines: number[];\r\n\r\n /**\r\n * Wrap long lines instead of horizontal scroll.\r\n */\r\n @property({ type: Boolean, attribute: 'wrap-lines', reflect: true })\r\n declare wrapLines: boolean;\r\n\r\n /**\r\n * Show the copy-to-clipboard button.\r\n */\r\n @property({ type: Boolean, attribute: 'show-copy-button', reflect: true })\r\n declare showCopyButton: boolean;\r\n\r\n /**\r\n * When set, collapse the code block to this many visible lines with a \"Show more\" toggle.\r\n */\r\n @property({ type: Number, attribute: 'max-lines' })\r\n declare maxLines: number | undefined;\r\n\r\n /**\r\n * Show/hide the header bar. When false, the copy button floats over the code.\r\n */\r\n @property({ type: Boolean, attribute: 'show-header', reflect: true })\r\n declare showHeader: boolean;\r\n\r\n /**\r\n * The syntax highlight adapter to use for this instance.\r\n * Defaults to `BpCodeBlock.defaultAdapter` which is the plainTextAdapter.\r\n */\r\n @property({ attribute: false })\r\n declare highlightAdapter: CodeBlockHighlightAdapter;\r\n\r\n /**\r\n * Global default adapter used when no per-instance adapter is set.\r\n */\r\n static defaultAdapter: CodeBlockHighlightAdapter = plainTextAdapter;\r\n\r\n @state() private _copyState: 'idle' | 'copied' | 'error' = 'idle';\r\n @state() private _expanded = false;\r\n @state() private _highlightedHtml = '';\r\n @state() private _adapterContext: unknown = undefined;\r\n @state() private _adapterInitialized = false;\r\n @state() private _lineCount = 0;\r\n @state() private _highlightSet: Set<number> = new Set();\r\n @state() private _highlightedLines: string[] = [];\r\n\r\n private _copyResetTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n static styles = [codeBlockStyles];\r\n\r\n constructor() {\r\n super();\r\n this.code = '';\r\n this.language = 'text';\r\n this.title = '';\r\n this.showLineNumbers = false;\r\n this.highlightLines = [];\r\n this.wrapLines = true;\r\n this.showCopyButton = true;\r\n this.maxLines = undefined;\r\n this.showHeader = true;\r\n this.highlightAdapter = BpCodeBlock.defaultAdapter;\r\n }\r\n\r\n disconnectedCallback(): void {\r\n super.disconnectedCallback();\r\n if (this._copyResetTimer) {\r\n clearTimeout(this._copyResetTimer);\r\n this._copyResetTimer = null;\r\n }\r\n }\r\n\r\n protected override willUpdate(changedProperties: PropertyValues): void {\r\n super.willUpdate(changedProperties);\r\n\r\n if (changedProperties.has('highlightAdapter')) {\r\n this._adapterInitialized = false;\r\n this._adapterContext = undefined;\r\n this._initializeAdapter();\r\n }\r\n\r\n if (changedProperties.has('code')) {\r\n this._lineCount = this.code.split('\\n').length;\r\n }\r\n\r\n if (changedProperties.has('highlightLines')) {\r\n this._highlightSet = new Set(this.highlightLines);\r\n }\r\n\r\n const needsRehighlight =\r\n changedProperties.has('code') ||\r\n changedProperties.has('language') ||\r\n changedProperties.has('highlightAdapter');\r\n\r\n if (needsRehighlight) {\r\n this._updateHighlightingSync();\r\n }\r\n }\r\n\r\n connectedCallback(): void {\r\n super.connectedCallback();\r\n this._initializeAdapter();\r\n }\r\n\r\n private async _initializeAdapter(): Promise<void> {\r\n const adapter = this.highlightAdapter;\r\n if (!this._adapterInitialized && adapter.initialize) {\r\n try {\r\n const context = await adapter.initialize();\r\n // Bail if adapter changed while awaiting\r\n if (this.highlightAdapter !== adapter) return;\r\n this._adapterContext = context;\r\n } catch {\r\n if (this.highlightAdapter !== adapter) return;\r\n this._adapterContext = undefined;\r\n }\r\n this._adapterInitialized = true;\r\n // Re-highlight with context after async init\r\n this._updateHighlightingSync();\r\n this.requestUpdate();\r\n }\r\n }\r\n\r\n private _updateHighlightingSync(): void {\r\n const adapter = this.highlightAdapter;\r\n\r\n try {\r\n const result = adapter.highlight({\r\n code: this.code,\r\n language: this.language,\r\n context: this._adapterContext,\r\n });\r\n this._highlightedHtml = result.html;\r\n } catch {\r\n // Fallback to plain text on adapter error\r\n this._highlightedHtml = escapeHtml(this.code);\r\n }\r\n\r\n this._highlightedLines = this._highlightedHtml.split('\\n');\r\n }\r\n\r\n private _handleCopy = async (): Promise<void> => {\r\n let success: boolean;\r\n\r\n try {\r\n if (navigator.clipboard) {\r\n await navigator.clipboard.writeText(this.code);\r\n success = true;\r\n } else {\r\n // Fallback for insecure contexts\r\n success = this._fallbackCopy();\r\n }\r\n } catch {\r\n success = this._fallbackCopy();\r\n }\r\n\r\n this._copyState = success ? 'copied' : 'error';\r\n\r\n this.dispatchEvent(\r\n new CustomEvent('bp-copy', {\r\n detail: { code: this.code, success },\r\n bubbles: true,\r\n composed: true,\r\n })\r\n );\r\n\r\n // Reset after 2 seconds\r\n if (this._copyResetTimer) {\r\n clearTimeout(this._copyResetTimer);\r\n }\r\n this._copyResetTimer = setTimeout(() => {\r\n this._copyState = 'idle';\r\n this._copyResetTimer = null;\r\n }, 2000);\r\n };\r\n\r\n private _fallbackCopy(): boolean {\r\n try {\r\n const textarea = document.createElement('textarea');\r\n textarea.value = this.code;\r\n textarea.style.position = 'fixed';\r\n textarea.style.left = '-9999px';\r\n textarea.style.top = '-9999px';\r\n document.body.appendChild(textarea);\r\n textarea.select();\r\n const result = document.execCommand('copy');\r\n document.body.removeChild(textarea);\r\n return result;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private _toggleExpanded(): void {\r\n this._expanded = !this._expanded;\r\n }\r\n\r\n private get _shouldCollapse(): boolean {\r\n return (\r\n this.maxLines !== undefined &&\r\n this.maxLines > 0 &&\r\n this._lineCount > this.maxLines\r\n );\r\n }\r\n\r\n private get _isCollapsed(): boolean {\r\n return this._shouldCollapse && !this._expanded;\r\n }\r\n\r\n private get _headerLabel(): string {\r\n return this.title || this.language;\r\n }\r\n\r\n private _getCopyAriaLabel(): string {\r\n if (this._copyState === 'copied') return 'Copied!';\r\n if (this._copyState === 'error') return 'Failed to copy';\r\n return 'Copy code';\r\n }\r\n\r\n private _renderCopyIcon() {\r\n if (this._copyState === 'copied') {\r\n return html`\r\n <slot name=\"copied-icon\">\r\n <svg\r\n class=\"code-block__icon\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n aria-hidden=\"true\"\r\n >\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg>\r\n </slot>\r\n `;\r\n }\r\n\r\n return html`\r\n <slot name=\"copy-icon\">\r\n <svg\r\n class=\"code-block__icon\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n aria-hidden=\"true\"\r\n >\r\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect>\r\n <path\r\n d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"\r\n ></path>\r\n </svg>\r\n </slot>\r\n `;\r\n }\r\n\r\n private _renderCopyButton() {\r\n if (!this.showCopyButton) return nothing;\r\n\r\n return html`\r\n <button\r\n part=\"copy-button\"\r\n class=\"code-block__copy code-block__copy--${this._copyState}\"\r\n aria-label=${this._getCopyAriaLabel()}\r\n @click=${this._handleCopy}\r\n >\r\n ${this._renderCopyIcon()}\r\n </button>\r\n `;\r\n }\r\n\r\n private _renderHeader() {\r\n if (!this.showHeader) return nothing;\r\n\r\n return html`\r\n <div part=\"header\" class=\"code-block__header\">\r\n <span part=\"title\" class=\"code-block__title\">\r\n <slot name=\"title\">${this._headerLabel}</slot>\r\n </span>\r\n <div part=\"controls\" class=\"code-block__controls\">\r\n <slot name=\"controls\"></slot>\r\n ${this._renderCopyButton()}\r\n </div>\r\n </div>\r\n `;\r\n }\r\n\r\n private _renderFloatingCopyButton() {\r\n if (this.showHeader || !this.showCopyButton) return nothing;\r\n\r\n return html`\r\n <div class=\"code-block__floating-copy\">${this._renderCopyButton()}</div>\r\n `;\r\n }\r\n\r\n private _renderLine(\r\n lineHtml: string,\r\n lineNumber: number,\r\n showNumber: boolean\r\n ) {\r\n const isHighlighted = this._highlightSet.has(lineNumber);\r\n // Template kept tight to avoid whitespace text nodes inside the CSS grid.\r\n // Anonymous text nodes in a grid become extra rows, adding visual gaps.\r\n return showNumber\r\n ? html`<span\r\n part=\"line-number\"\r\n class=\"code-block__line-number\"\r\n aria-hidden=\"true\"\r\n >${lineNumber}</span\r\n ><span\r\n part=\"line\"\r\n class=\"code-block__line ${isHighlighted\r\n ? 'code-block__line--highlighted'\r\n : ''}\"\r\n aria-current=${ifDefined(isHighlighted ? 'true' : undefined)}\r\n >${unsafeHTML(lineHtml)}</span\r\n >`\r\n : html`<span\r\n part=\"line\"\r\n class=\"code-block__line ${isHighlighted\r\n ? 'code-block__line--highlighted'\r\n : ''}\"\r\n aria-current=${ifDefined(isHighlighted ? 'true' : undefined)}\r\n >${unsafeHTML(lineHtml)}</span\r\n >`;\r\n }\r\n\r\n private _renderCodeLines() {\r\n // Templates kept tight to avoid whitespace text nodes inside CSS grids.\r\n if (this.showLineNumbers) {\r\n return html`<div class=\"code-block__lines\">${this._highlightedLines.map(\r\n (lineHtml, index) => this._renderLine(lineHtml, index + 1, true)\r\n )}</div>`;\r\n }\r\n\r\n if (this.highlightLines.length > 0) {\r\n return html`<div class=\"code-block__lines code-block__lines--no-gutter\">${this._highlightedLines.map(\r\n (lineHtml, index) => this._renderLine(lineHtml, index + 1, false)\r\n )}</div>`;\r\n }\r\n\r\n return unsafeHTML(this._highlightedHtml);\r\n }\r\n\r\n private _renderExpandButton() {\r\n if (!this._shouldCollapse) return nothing;\r\n\r\n return html`\r\n <button\r\n part=\"expand-button\"\r\n class=\"code-block__expand\"\r\n @click=${this._toggleExpanded}\r\n aria-expanded=${this._expanded}\r\n >\r\n ${this._expanded ? 'Show less' : 'Show more'}\r\n </button>\r\n `;\r\n }\r\n\r\n render() {\r\n const bodyClasses = [\r\n 'code-block__body',\r\n this.wrapLines ? 'code-block__body--wrap' : 'code-block__body--scroll',\r\n this._isCollapsed ? 'code-block__body--collapsed' : '',\r\n ]\r\n .filter(Boolean)\r\n .join(' ');\r\n\r\n return html`\r\n <div\r\n part=\"base\"\r\n class=\"code-block\"\r\n role=\"region\"\r\n aria-label=${this.title\r\n ? `Code example: ${this.title}`\r\n : 'Code example'}\r\n style=${this._isCollapsed && this.maxLines\r\n ? `--_max-lines: ${this.maxLines}`\r\n : ''}\r\n >\r\n ${this._renderHeader()}\r\n <div part=\"body\" class=${bodyClasses}>\r\n ${this._renderFloatingCopyButton()}\r\n <pre\r\n part=\"pre\"\r\n class=\"code-block__pre\"\r\n ><code part=\"code\" class=\"code-block__code\">${this._renderCodeLines()}</code></pre>\r\n ${this._isCollapsed\r\n ? html`<div class=\"code-block__gradient\"></div>`\r\n : nothing}\r\n </div>\r\n ${this._renderExpandButton()}\r\n <div class=\"code-block__status\" role=\"status\" aria-live=\"polite\">\r\n ${this._copyState === 'copied' ? 'Copied to clipboard' : ''}\r\n ${this._copyState === 'error' ? 'Failed to copy' : ''}\r\n </div>\r\n </div>\r\n `;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'bp-code-block': BpCodeBlock;\r\n }\r\n}\r\n"],"names":["codeBlockStyles","css","htmlEscapeMap","escapeHtml","text","char","plainTextAdapter","code","BpCodeBlock","LitElement","success","changedProperties","adapter","context","result","textarea","html","nothing","lineHtml","lineNumber","showNumber","isHighlighted","ifDefined","unsafeHTML","index","bodyClasses","__decorateClass","property","state","customElement"],"mappings":";;;;AAEO,MAAMA,IAAkBC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@krollins/blueprint",
3
- "version": "0.1.14",
3
+ "version": "0.1.15",
4
4
  "description": "A highly portable and customizable component library built on Lit",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",