vanilla-breeze 0.1.2 → 0.1.4

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 (268) hide show
  1. package/dist/cdn/components/accessibility-specimen.js +11 -0
  2. package/dist/cdn/components/accordion-wc.js +1 -1
  3. package/dist/cdn/components/activity-feed.js +2 -0
  4. package/dist/cdn/components/adr-wc.js +17 -17
  5. package/dist/cdn/components/ai-chat.js +28 -0
  6. package/dist/cdn/components/ai-summary.js +10 -0
  7. package/dist/cdn/components/analytics-panel.js +5 -5
  8. package/dist/cdn/components/audio-player.js +3 -3
  9. package/dist/cdn/components/audio-visualizer.js +2 -2
  10. package/dist/cdn/components/author-index.js +2 -2
  11. package/dist/cdn/components/brand-mark.js +1 -1
  12. package/dist/cdn/components/bread-crumb.js +2 -0
  13. package/dist/cdn/components/breakpoint-specimen.js +26 -0
  14. package/dist/cdn/components/burndown-chart.js +2 -0
  15. package/dist/cdn/components/calendar-wc.js +2 -2
  16. package/dist/cdn/components/capacity-plan.js +25 -0
  17. package/dist/cdn/components/card-list.js +1 -1
  18. package/dist/cdn/components/carousel-wc.js +1 -1
  19. package/dist/cdn/components/change-set.js +2 -2
  20. package/dist/cdn/components/chart-wc.js +58 -36
  21. package/dist/cdn/components/chat-input.js +1 -1
  22. package/dist/cdn/components/chat-window.js +1 -1
  23. package/dist/cdn/components/color-palette.js +9 -9
  24. package/dist/cdn/components/color-picker.js +1 -1
  25. package/dist/cdn/components/combo-box.js +1 -1
  26. package/dist/cdn/components/command-palette.js +1 -1
  27. package/dist/cdn/components/comment-box.js +60 -0
  28. package/dist/cdn/components/comment-thread.js +60 -0
  29. package/dist/cdn/components/comment-wc.js +1 -1
  30. package/dist/cdn/components/compare-surface.js +1 -1
  31. package/dist/cdn/components/component-sampler.js +4 -4
  32. package/dist/cdn/components/consent-banner.js +1 -1
  33. package/dist/cdn/components/content-lens.js +1 -1
  34. package/dist/cdn/components/content-swap.js +1 -1
  35. package/dist/cdn/components/context-menu.js +1 -1
  36. package/dist/cdn/components/data-table.js +1 -1
  37. package/dist/cdn/components/date-picker.js +1 -1
  38. package/dist/cdn/components/day-view.js +1 -1
  39. package/dist/cdn/components/diagram-wc.js +3 -0
  40. package/dist/cdn/components/drag-surface.js +1 -1
  41. package/dist/cdn/components/drop-down.js +1 -1
  42. package/dist/cdn/components/emoji-picker.js +1 -1
  43. package/dist/cdn/components/empathy-map.js +41 -43
  44. package/dist/cdn/components/flow-diagram.js +1 -1
  45. package/dist/cdn/components/font-pairer.js +81 -81
  46. package/dist/cdn/components/foot-notes.js +1 -1
  47. package/dist/cdn/components/form-field.js +1 -1
  48. package/dist/cdn/components/gantt-chart.js +1 -1
  49. package/dist/cdn/components/geo-map.js +25 -23
  50. package/dist/cdn/components/glossary-index.js +1 -1
  51. package/dist/cdn/components/glossary-wc.js +1 -1
  52. package/dist/cdn/components/gradient-builder.js +29 -29
  53. package/dist/cdn/components/heading-links.js +1 -1
  54. package/dist/cdn/components/highlight-wc.js +2 -2
  55. package/dist/cdn/components/image-gallery.js +1 -1
  56. package/dist/cdn/components/image-map.js +1 -1
  57. package/dist/cdn/components/impact-effort.js +1 -1
  58. package/dist/cdn/components/include-file.js +1 -1
  59. package/dist/cdn/components/iron-triangle.js +2 -0
  60. package/dist/cdn/components/kanban-board.js +1 -1
  61. package/dist/cdn/components/layout-specimen.js +35 -0
  62. package/dist/cdn/components/manifest.json +228 -100
  63. package/dist/cdn/components/markdown-editor.js +1 -1
  64. package/dist/cdn/components/markdown-viewer.js +12 -12
  65. package/dist/cdn/components/motion-specimen.js +12 -12
  66. package/dist/cdn/components/nav-bar.js +2 -0
  67. package/dist/cdn/components/note-wc.js +2 -2
  68. package/dist/cdn/components/notification-wc.js +4 -4
  69. package/dist/cdn/components/page-info.js +21 -21
  70. package/dist/cdn/components/page-stats.js +1 -1
  71. package/dist/cdn/components/page-toc.js +1 -1
  72. package/dist/cdn/components/page-tools.js +1 -1
  73. package/dist/cdn/components/page-tour.js +6 -6
  74. package/dist/cdn/components/pager-wc.js +2 -0
  75. package/dist/cdn/components/palette-generator.js +11 -11
  76. package/dist/cdn/components/poll-wc.js +2 -0
  77. package/dist/cdn/components/pop-over.js +2 -0
  78. package/dist/cdn/components/popularity-index.js +2 -2
  79. package/dist/cdn/components/print-page.js +1 -1
  80. package/dist/cdn/components/product-roadmap.js +3 -0
  81. package/dist/cdn/components/progress-tracker.js +2 -0
  82. package/dist/cdn/components/qr-code.js +1 -1
  83. package/dist/cdn/components/quadrant-grid.js +3 -0
  84. package/dist/cdn/components/quality-target.js +12 -0
  85. package/dist/cdn/components/reaction-bar.js +2 -0
  86. package/dist/cdn/components/reader-view.js +3 -3
  87. package/dist/cdn/components/reading-progress.js +2 -0
  88. package/dist/cdn/components/recently-visited.js +26 -2
  89. package/dist/cdn/components/requirement-card.js +122 -0
  90. package/dist/cdn/components/review-surface.js +34 -40
  91. package/dist/cdn/components/risk-register.js +25 -0
  92. package/dist/cdn/components/roadmap.js +3 -0
  93. package/dist/cdn/components/score-card.js +197 -0
  94. package/dist/cdn/components/selection-menu.js +1 -1
  95. package/dist/cdn/components/semantic-palette.js +15 -15
  96. package/dist/cdn/components/settings-panel.js +12 -12
  97. package/dist/cdn/components/share-wc.js +2 -2
  98. package/dist/cdn/components/short-cuts.js +1 -1
  99. package/dist/cdn/components/site-index.js +4 -4
  100. package/dist/cdn/components/site-map-wc.js +1 -1
  101. package/dist/cdn/components/site-map.js +1 -1
  102. package/dist/cdn/components/site-search.js +9 -9
  103. package/dist/cdn/components/slide-accept.js +1 -1
  104. package/dist/cdn/components/social-embed.js +1 -1
  105. package/dist/cdn/components/spacing-specimen.js +5 -5
  106. package/dist/cdn/components/split-surface.js +1 -1
  107. package/dist/cdn/components/star-rating.js +1 -1
  108. package/dist/cdn/components/status-wc.js +2 -0
  109. package/dist/cdn/components/stepper-wc.js +2 -0
  110. package/dist/cdn/components/story-map.js +1 -1
  111. package/dist/cdn/components/tab-set.js +1 -1
  112. package/dist/cdn/components/text-reader.js +2 -2
  113. package/dist/cdn/components/theme-catalog.js +28 -0
  114. package/dist/cdn/components/theme-export.js +20 -12
  115. package/dist/cdn/components/theme-import.js +44 -0
  116. package/dist/cdn/components/theme-picker.js +31 -28
  117. package/dist/cdn/components/time-index.js +2 -2
  118. package/dist/cdn/components/time-picker.js +1 -1
  119. package/dist/cdn/components/toast-msg.js +3 -3
  120. package/dist/cdn/components/token-specimen.js +14 -14
  121. package/dist/cdn/components/tool-tip.js +1 -1
  122. package/dist/cdn/components/topic-map.js +3 -2
  123. package/dist/cdn/components/traceability-matrix.js +3 -0
  124. package/dist/cdn/components/trust-filter.js +3 -3
  125. package/dist/cdn/components/type-specimen.js +15 -15
  126. package/dist/cdn/components/user-journey.js +63 -70
  127. package/dist/cdn/components/user-persona.js +75 -13
  128. package/dist/cdn/components/user-story.js +13 -12
  129. package/dist/cdn/components/version-switcher.js +17 -0
  130. package/dist/cdn/components/video-player.js +4 -4
  131. package/dist/cdn/components/watch-wc.js +2 -2
  132. package/dist/cdn/components/week-view.js +1 -1
  133. package/dist/cdn/components/work-item.js +29 -28
  134. package/dist/cdn/components/youtube-player.js +1 -1
  135. package/dist/cdn/packs/design-system.full.js +59 -51
  136. package/dist/cdn/packs/effects.full.js +1 -1
  137. package/dist/cdn/packs/icons.effects.js +1 -1
  138. package/dist/cdn/packs/icons.full.js +1 -1
  139. package/dist/cdn/packs/kawaii.full.css +1 -1
  140. package/dist/cdn/packs/kawaii.full.js +6 -6
  141. package/dist/cdn/packs/kawaii.theme.css +1 -1
  142. package/dist/cdn/packs/manifest.json +11 -11
  143. package/dist/cdn/packs/ui.full.css +1 -1
  144. package/dist/cdn/packs/ui.full.js +54 -51
  145. package/dist/cdn/packs/ux-planning.full.css +1 -1
  146. package/dist/cdn/packs/ux-planning.full.js +324 -248
  147. package/dist/cdn/themes/8bit.css +1 -1
  148. package/dist/cdn/themes/8bit.tokens.json +662 -0
  149. package/dist/cdn/themes/alpha1999-dark.tokens.json +693 -0
  150. package/dist/cdn/themes/alpha1999.css +1 -1
  151. package/dist/cdn/themes/alpha1999.tokens.json +869 -0
  152. package/dist/cdn/themes/anthropic.css +2 -0
  153. package/dist/cdn/themes/anthropic.tokens.json +564 -0
  154. package/dist/cdn/themes/art-deco-dark.tokens.json +407 -0
  155. package/dist/cdn/themes/art-deco.css +1 -1
  156. package/dist/cdn/themes/art-deco.tokens.json +581 -0
  157. package/dist/cdn/themes/bauhaus-dark.tokens.json +260 -0
  158. package/dist/cdn/themes/bauhaus.css +1 -1
  159. package/dist/cdn/themes/bauhaus.tokens.json +589 -0
  160. package/dist/cdn/themes/brutalist-dark.tokens.json +503 -0
  161. package/dist/cdn/themes/brutalist.tokens.json +677 -0
  162. package/dist/cdn/themes/catalog/atlassian.tokens.json +303 -0
  163. package/dist/cdn/themes/catalog/bootstrap.tokens.json +304 -0
  164. package/dist/cdn/themes/catalog/carbon.tokens.json +301 -0
  165. package/dist/cdn/themes/catalog/catppuccin-mocha.tokens.json +301 -0
  166. package/dist/cdn/themes/catalog/govuk.tokens.json +301 -0
  167. package/dist/cdn/themes/catalog/manifest.json +132 -0
  168. package/dist/cdn/themes/catalog/material.tokens.json +289 -0
  169. package/dist/cdn/themes/catalog/salesforce.tokens.json +301 -0
  170. package/dist/cdn/themes/catalog/tailwind.tokens.json +302 -0
  171. package/dist/cdn/themes/catppuccin-frappe.css +1 -1
  172. package/dist/cdn/themes/catppuccin-frappe.tokens.json +608 -0
  173. package/dist/cdn/themes/catppuccin-latte-dark.tokens.json +472 -0
  174. package/dist/cdn/themes/catppuccin-latte.css +1 -1
  175. package/dist/cdn/themes/catppuccin-latte.tokens.json +608 -0
  176. package/dist/cdn/themes/catppuccin-macchiato.css +1 -1
  177. package/dist/cdn/themes/catppuccin-macchiato.tokens.json +608 -0
  178. package/dist/cdn/themes/catppuccin-mocha.tokens.json +608 -0
  179. package/dist/cdn/themes/classic-dark.tokens.json +503 -0
  180. package/dist/cdn/themes/classic.tokens.json +640 -0
  181. package/dist/cdn/themes/claymorphism-dark.tokens.json +493 -0
  182. package/dist/cdn/themes/claymorphism.css +1 -1
  183. package/dist/cdn/themes/claymorphism.tokens.json +626 -0
  184. package/dist/cdn/themes/clinical-dark.tokens.json +472 -0
  185. package/dist/cdn/themes/clinical.tokens.json +608 -0
  186. package/dist/cdn/themes/cottagecore-dark.tokens.json +412 -0
  187. package/dist/cdn/themes/cottagecore.css +1 -1
  188. package/dist/cdn/themes/cottagecore.tokens.json +544 -0
  189. package/dist/cdn/themes/cyber.tokens.json +668 -0
  190. package/dist/cdn/themes/dawn-dark.tokens.json +472 -0
  191. package/dist/cdn/themes/dawn.css +1 -1
  192. package/dist/cdn/themes/dawn.tokens.json +608 -0
  193. package/dist/cdn/themes/dracula.tokens.json +534 -0
  194. package/dist/cdn/themes/dusk.tokens.json +533 -0
  195. package/dist/cdn/themes/editorial-dark.tokens.json +400 -0
  196. package/dist/cdn/themes/editorial.tokens.json +690 -0
  197. package/dist/cdn/themes/financial-dark.tokens.json +472 -0
  198. package/dist/cdn/themes/financial.css +1 -1
  199. package/dist/cdn/themes/financial.tokens.json +607 -0
  200. package/dist/cdn/themes/genai.tokens.json +534 -0
  201. package/dist/cdn/themes/glassmorphism-dark.tokens.json +489 -0
  202. package/dist/cdn/themes/glassmorphism.css +1 -1
  203. package/dist/cdn/themes/glassmorphism.tokens.json +632 -0
  204. package/dist/cdn/themes/government-dark.tokens.json +472 -0
  205. package/dist/cdn/themes/government.tokens.json +608 -0
  206. package/dist/cdn/themes/gruvbox-dark.tokens.json +472 -0
  207. package/dist/cdn/themes/gruvbox.tokens.json +608 -0
  208. package/dist/cdn/themes/high-noon-dark.tokens.json +397 -0
  209. package/dist/cdn/themes/high-noon.tokens.json +533 -0
  210. package/dist/cdn/themes/ibm.css +2 -0
  211. package/dist/cdn/themes/ibm.tokens.json +568 -0
  212. package/dist/cdn/themes/kawaii-dark.tokens.json +549 -0
  213. package/dist/cdn/themes/kawaii.css +1 -1
  214. package/dist/cdn/themes/kawaii.tokens.json +641 -0
  215. package/dist/cdn/themes/magna-dark.tokens.json +482 -0
  216. package/dist/cdn/themes/magna.css +1 -1
  217. package/dist/cdn/themes/magna.tokens.json +632 -0
  218. package/dist/cdn/themes/manifest.json +162 -62
  219. package/dist/cdn/themes/mcdonalds.css +2 -0
  220. package/dist/cdn/themes/mcdonalds.tokens.json +533 -0
  221. package/dist/cdn/themes/midnight.tokens.json +534 -0
  222. package/dist/cdn/themes/minimal-dark.tokens.json +294 -0
  223. package/dist/cdn/themes/minimal.tokens.json +494 -0
  224. package/dist/cdn/themes/modern-dark.tokens.json +490 -0
  225. package/dist/cdn/themes/modern.tokens.json +573 -0
  226. package/dist/cdn/themes/nes-dark.tokens.json +564 -0
  227. package/dist/cdn/themes/nes.css +1 -1
  228. package/dist/cdn/themes/nes.tokens.json +687 -0
  229. package/dist/cdn/themes/neumorphism-dark.tokens.json +471 -0
  230. package/dist/cdn/themes/neumorphism.css +1 -1
  231. package/dist/cdn/themes/neumorphism.tokens.json +589 -0
  232. package/dist/cdn/themes/nord-dark.tokens.json +484 -0
  233. package/dist/cdn/themes/nord.tokens.json +619 -0
  234. package/dist/cdn/themes/organic-dark.tokens.json +532 -0
  235. package/dist/cdn/themes/organic.tokens.json +685 -0
  236. package/dist/cdn/themes/rose-pine-dark.tokens.json +472 -0
  237. package/dist/cdn/themes/rose-pine.tokens.json +608 -0
  238. package/dist/cdn/themes/rough-dark.tokens.json +515 -0
  239. package/dist/cdn/themes/rough.css +1 -1
  240. package/dist/cdn/themes/rough.tokens.json +650 -0
  241. package/dist/cdn/themes/solarized-dark.tokens.json +397 -0
  242. package/dist/cdn/themes/solarized.tokens.json +532 -0
  243. package/dist/cdn/themes/starbucks.css +2 -0
  244. package/dist/cdn/themes/starbucks.tokens.json +593 -0
  245. package/dist/cdn/themes/startup-dark.tokens.json +522 -0
  246. package/dist/cdn/themes/startup.css +1 -1
  247. package/dist/cdn/themes/startup.tokens.json +607 -0
  248. package/dist/cdn/themes/super2026-dark.tokens.json +667 -0
  249. package/dist/cdn/themes/super2026.tokens.json +863 -0
  250. package/dist/cdn/themes/swiss-dark.tokens.json +390 -0
  251. package/dist/cdn/themes/swiss.tokens.json +750 -0
  252. package/dist/cdn/themes/terminal.css +1 -1
  253. package/dist/cdn/themes/terminal.tokens.json +689 -0
  254. package/dist/cdn/themes/tokyo-night-dark.tokens.json +472 -0
  255. package/dist/cdn/themes/tokyo-night.tokens.json +608 -0
  256. package/dist/cdn/themes/vaporwave-dark.tokens.json +413 -0
  257. package/dist/cdn/themes/vaporwave.tokens.json +549 -0
  258. package/dist/cdn/themes/win9x-dark.tokens.json +563 -0
  259. package/dist/cdn/themes/win9x.tokens.json +700 -0
  260. package/dist/cdn/vanilla-breeze-charts.css +1 -1
  261. package/dist/cdn/vanilla-breeze-charts.js +58 -36
  262. package/dist/cdn/vanilla-breeze-core.css +1 -1
  263. package/dist/cdn/vanilla-breeze-core.js +246 -51
  264. package/dist/cdn/vanilla-breeze-dev.js +1 -1
  265. package/dist/cdn/vanilla-breeze-extras.js +90 -80
  266. package/dist/cdn/vanilla-breeze.css +1 -1
  267. package/dist/cdn/vanilla-breeze.js +1395 -405
  268. package/package.json +14 -4
@@ -1,4 +1,4 @@
1
- var m=`
1
+ var _=`
2
2
  :host {
3
3
  display: block;
4
4
  font-family: var(--_font-sans);
@@ -12,11 +12,20 @@ var m=`
12
12
  --_muted: var(--empathy-map-muted, var(--color-text-muted, #666666));
13
13
  --_text: var(--empathy-map-text, var(--color-text, #1a1a1a));
14
14
  --_radius: var(--empathy-map-radius, var(--radius-xl, 1rem));
15
- --_accent: var(--empathy-map-accent, var(--color-interactive, #0066cc));
16
- --_says: var(--empathy-map-says, #3b82f6);
17
- --_thinks: var(--empathy-map-thinks, #8b5cf6);
18
- --_does: var(--empathy-map-does, #f59e0b);
19
- --_feels: var(--empathy-map-feels, #ef4444);
15
+ --_accent: var(--empathy-map-accent, var(--color-interactive, var(--color-primary, #0066cc)));
16
+ --_link: var(--empathy-map-link, var(--color-interactive, var(--color-primary, #6366f1)));
17
+ --_primary: var(--empathy-map-primary, var(--color-primary, #6366f1));
18
+ --_accent-bar: var(--empathy-map-accent-bar, var(--color-accent, #8b5cf6));
19
+ --_says: var(--empathy-map-says, var(--color-info, #3b82f6));
20
+ --_thinks: var(--empathy-map-thinks, var(--color-accent, #8b5cf6));
21
+ --_does: var(--empathy-map-does, var(--color-warning, #f59e0b));
22
+ --_feels: var(--empathy-map-feels, var(--color-error, #ef4444));
23
+ --_says-bg: color-mix(in oklch, var(--_says) 16%, var(--_card));
24
+ --_thinks-bg: color-mix(in oklch, var(--_thinks) 16%, var(--_card));
25
+ --_does-bg: color-mix(in oklch, var(--_does) 16%, var(--_card));
26
+ --_feels-bg: color-mix(in oklch, var(--_feels) 16%, var(--_card));
27
+ --_chip-type-bg: color-mix(in oklch, var(--_accent-bar) 18%, var(--_card));
28
+ --_chip-type-fg: var(--_accent-bar);
20
29
  --_font-sans: var(--empathy-map-font, var(--font-sans, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif));
21
30
  --_font-xs: var(--empathy-map-font-xs, var(--font-size-xs, 0.75rem));
22
31
  --_font-sm: var(--empathy-map-font-sm, var(--font-size-sm, 0.875rem));
@@ -58,7 +67,7 @@ var m=`
58
67
  inset-block: 0;
59
68
  inset-inline-start: 0;
60
69
  width: 4px;
61
- background: linear-gradient(135deg, #6366f1, #8b5cf6);
70
+ background: linear-gradient(135deg, var(--_primary), var(--_accent-bar));
62
71
  }
63
72
 
64
73
  .empathy-map__header-top {
@@ -90,12 +99,8 @@ var m=`
90
99
  }
91
100
 
92
101
  .chip--type {
93
- color: #6366f1;
94
- background: #ede9fe;
95
- }
96
-
97
- @media (prefers-color-scheme: dark) {
98
- .chip--type { color: #a78bfa; background: #2e1065; }
102
+ color: var(--_chip-type-fg);
103
+ background: var(--_chip-type-bg);
99
104
  }
100
105
 
101
106
  /* \u2500\u2500 Persona ref \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
@@ -116,7 +121,7 @@ var m=`
116
121
  flex-shrink: 0;
117
122
  }
118
123
 
119
- a.persona-ref:hover { color: #6366f1; text-decoration: underline; }
124
+ a.persona-ref:hover { color: var(--_link); text-decoration: underline; }
120
125
 
121
126
  /* \u2500\u2500 Title & summary (slotted content) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
122
127
  .empathy-map__title-wrap {
@@ -205,17 +210,10 @@ var m=`
205
210
  height: 16px;
206
211
  }
207
212
 
208
- .quadrant--says .quadrant__icon { background: #dbeafe; color: var(--_says); }
209
- .quadrant--thinks .quadrant__icon { background: #ede9fe; color: var(--_thinks); }
210
- .quadrant--does .quadrant__icon { background: #fef3c7; color: var(--_does); }
211
- .quadrant--feels .quadrant__icon { background: #fee2e2; color: var(--_feels); }
212
-
213
- @media (prefers-color-scheme: dark) {
214
- .quadrant--says .quadrant__icon { background: #1e3a5f; }
215
- .quadrant--thinks .quadrant__icon { background: #2e1065; }
216
- .quadrant--does .quadrant__icon { background: #451a03; }
217
- .quadrant--feels .quadrant__icon { background: #450a0a; }
218
- }
213
+ .quadrant--says .quadrant__icon { background: var(--_says-bg); color: var(--_says); }
214
+ .quadrant--thinks .quadrant__icon { background: var(--_thinks-bg); color: var(--_thinks); }
215
+ .quadrant--does .quadrant__icon { background: var(--_does-bg); color: var(--_does); }
216
+ .quadrant--feels .quadrant__icon { background: var(--_feels-bg); color: var(--_feels); }
219
217
 
220
218
  .quadrant__label {
221
219
  font-size: 13px;
@@ -492,7 +490,7 @@ var m=`
492
490
  @media print {
493
491
  .empathy-map {
494
492
  break-inside: avoid;
495
- border-color: #ccc;
493
+ border-color: var(--_border);
496
494
  }
497
495
 
498
496
  .quadrant__edit-btn,
@@ -511,9 +509,9 @@ var m=`
511
509
 
512
510
  /* \u2500\u2500 Utility \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */
513
511
  .state-msg { padding: var(--_space-l); font-size: var(--_font-sm); color: var(--_muted); font-style: italic; }
514
- .state-msg--error { color: #dc2626; }
515
- code { font-family: Monaco, Menlo, monospace; font-size: 0.88em; }
516
- `;var k=window.matchMedia("(prefers-reduced-motion: reduce)");var v=new Map;function y(i,t,e={}){let a=e.priority??10,n={impl:t,bundle:e.bundle,contract:e.contract,priority:a},r=v.get(i);if(customElements.get(i)){if(!r||r.priority>=a){r&&r.priority===a&&r.impl!==t&&console.warn(`[VB Bundle] Tag <${i}> already registered by "${r.bundle}" (priority ${r.priority}). Skipping "${e.bundle}".`);return}console.warn(`[VB Bundle] Tag <${i}> defined by "${r.bundle}" cannot be replaced (customElements.define is permanent). "${e.bundle}" has higher priority but arrived late.`);return}if(r&&r.priority>=a){r.priority===a&&console.warn(`[VB Bundle] Tag <${i}> already registered by "${r.bundle}". Skipping "${e.bundle}" (first wins at equal priority).`);return}v.set(i,n),customElements.define(i,t)}function c(i){return String(i).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function p(i){return`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${i}</svg>`}var l={user:'<path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/>',pencil:'<path d="M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"/><path d="m15 5 4 4"/>',check:'<path d="M20 6 9 17l-5-5"/>',target:'<circle cx="12" cy="12" r="10"/><circle cx="12" cy="12" r="6"/><circle cx="12" cy="12" r="2"/>',alertTriangle:'<path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"/><path d="M12 9v4"/><path d="M12 17h.01"/>',messageCircle:'<path d="M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719"/>',lightbulb:'<path d="M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"/><path d="M9 18h6"/><path d="M10 22h4"/>',wrench:'<path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z"/>',heart:'<path d="M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5"/>',mapPin:'<path d="M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0"/><circle cx="12" cy="10" r="3"/>',checkCircle:'<path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><path d="m9 11 3 3L22 4"/>',x:'<path d="M18 6 6 18"/><path d="m6 6 12 12"/>',download:'<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" x2="12" y1="15" y2="3"/>',send:'<path d="M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z"/><path d="m21.854 2.147-10.94 10.939"/>'},h={says:{label:"Says",icon:l.messageCircle,color:"#3b82f6"},thinks:{label:"Thinks",icon:l.lightbulb,color:"#8b5cf6"},does:{label:"Does",icon:l.wrench,color:"#f59e0b"},feels:{label:"Feels",icon:l.heart,color:"#ef4444"}},x={delighted:{emoji:"\u{1F604}",score:.95,color:"#16a34a"},satisfied:{emoji:"\u{1F60A}",score:.8,color:"#22c55e"},hopeful:{emoji:"\u{1F642}",score:.68,color:"#84cc16"},curious:{emoji:"\u{1F914}",score:.55,color:"#eab308"},neutral:{emoji:"\u{1F610}",score:.5,color:"#94a3b8"},uncertain:{emoji:"\u{1F615}",score:.4,color:"#f97316"},confused:{emoji:"\u{1F635}",score:.3,color:"#fb923c"},frustrated:{emoji:"\u{1F624}",score:.18,color:"#ef4444"},angry:{emoji:"\u{1F620}",score:.05,color:"#dc2626"}};var _=["says","thinks","does","feels"],f=class extends HTMLElement{static get observedAttributes(){return["persona","persona-id","src","editable","compact"]}#t=new Map;constructor(){super(),this.attachShadow({mode:"open"}),this.__quadrants=null,this.__goals=null,this.__painPoints=null,this._editingQuadrants=new Set}get quadrants(){return this.__quadrants}set quadrants(t){this.__quadrants=t,this.isConnected&&this._render()}get goals(){return this.__goals}set goals(t){this.__goals=t,this.isConnected&&this._render()}get painPoints(){return this.__painPoints}set painPoints(t){this.__painPoints=t,this.isConnected&&this._render()}#e(){for(let t of this.children){let e=t.getAttribute("slot");e&&this.#t.set(e,t.textContent.trim())}}_resolve(t){return this.getAttribute(t)||this.#t.get(t)||""}connectedCallback(){this.#e(),this.setAttribute("data-upgraded",""),this.hasAttribute("src")?this._loadSrc(this.getAttribute("src")):this._render()}disconnectedCallback(){this.removeAttribute("data-upgraded")}attributeChangedCallback(t){this.isConnected&&(t==="src"?this._loadSrc(this.getAttribute("src")):this._render())}editQuadrant(t){_.includes(t)&&this.hasAttribute("editable")&&this._openEdit(t)}closeQuadrant(t){_.includes(t)&&this._closeEdit(t)}async _loadSrc(t){if(t){this.shadowRoot.innerHTML=`<style>${m}</style><div class="state-msg">Loading\u2026</div>`;try{let e=await fetch(t);if(!e.ok)throw new Error(`HTTP ${e.status}`);let a=await e.json();if(a.persona&&this.setAttribute("persona",a.persona),a.personaId&&this.setAttribute("persona-id",a.personaId),a.title&&!this.querySelector('[slot="title"]')){let n=document.createElement("h2");n.slot="title",n.textContent=a.title,this.appendChild(n)}if(a.summary&&!this.querySelector('[slot="summary"]')){let n=document.createElement("p");n.slot="summary",n.textContent=a.summary,this.appendChild(n)}this.__quadrants=a.quadrants||null,this.__goals=a.goals||null,this.__painPoints=a.painPoints||null,this._render()}catch(e){this.shadowRoot.innerHTML=`<style>${m}</style><div class="state-msg state-msg--error">Could not load empathy map: ${c(e.message)}</div>`}}}_render(){let t=this._resolve("persona")||"",e=this._resolve("persona-id")||"",a=this.hasAttribute("compact"),n=this.hasAttribute("editable"),r=!!this.querySelector('[slot="title"]')||this.#t.has("title"),s=!!this.querySelector('[slot="summary"]')||this.#t.has("summary"),d=this.__goals?.length||this.querySelector('[slot="goals"]'),o=this.__painPoints?.length||this.querySelector('[slot="pain-points"]');this.shadowRoot.innerHTML=`<style>${m}</style>
512
+ .state-msg--error { color: var(--color-error-text, var(--color-error, #dc2626)); }
513
+ code { font-family: var(--font-mono, Monaco, Menlo, monospace); font-size: 0.88em; }
514
+ `;var E=window.matchMedia("(prefers-reduced-motion: reduce)");var g=new Map;function y(o,t,e={}){let a=e.priority??10,r={impl:t,bundle:e.bundle,contract:e.contract,priority:a},n=g.get(o);if(customElements.get(o)){if(!n||n.priority>=a){n&&n.priority===a&&n.impl!==t&&console.warn(`[VB Bundle] Tag <${o}> already registered by "${n.bundle}" (priority ${n.priority}). Skipping "${e.bundle}".`);return}console.warn(`[VB Bundle] Tag <${o}> defined by "${n.bundle}" cannot be replaced (customElements.define is permanent). "${e.bundle}" has higher priority but arrived late.`);return}if(n&&n.priority>=a){n.priority===a&&console.warn(`[VB Bundle] Tag <${o}> already registered by "${n.bundle}". Skipping "${e.bundle}" (first wins at equal priority).`);return}g.set(o,r),customElements.define(o,t)}var k=0;function x(o,t,e="vb-vt"){if(!o?.isConnected||typeof document>"u"||!("startViewTransition"in document)||matchMedia("(prefers-reduced-motion: reduce)").matches)return t(),null;let a=`${e}-${++k}`;o.style.viewTransitionName=a;let r=document.startViewTransition(t);return r.finished.finally(()=>{o.style.viewTransitionName===a&&(o.style.viewTransitionName="")}),r}function c(o){return String(o).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}function p(o){return`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${o}</svg>`}var l={user:'<path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2"/><circle cx="12" cy="7" r="4"/>',pencil:'<path d="M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z"/><path d="m15 5 4 4"/>',check:'<path d="M20 6 9 17l-5-5"/>',target:'<circle cx="12" cy="12" r="10"/><circle cx="12" cy="12" r="6"/><circle cx="12" cy="12" r="2"/>',alertTriangle:'<path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"/><path d="M12 9v4"/><path d="M12 17h.01"/>',messageCircle:'<path d="M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719"/>',lightbulb:'<path d="M15 14c.2-1 .7-1.7 1.5-2.5 1-.9 1.5-2.2 1.5-3.5A6 6 0 0 0 6 8c0 1 .2 2.2 1.5 3.5.7.7 1.3 1.5 1.5 2.5"/><path d="M9 18h6"/><path d="M10 22h4"/>',wrench:'<path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z"/>',heart:'<path d="M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5"/>',mapPin:'<path d="M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0"/><circle cx="12" cy="10" r="3"/>',checkCircle:'<path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><path d="m9 11 3 3L22 4"/>',x:'<path d="M18 6 6 18"/><path d="m6 6 12 12"/>',download:'<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" x2="12" y1="15" y2="3"/>',send:'<path d="M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z"/><path d="m21.854 2.147-10.94 10.939"/>'},f={says:{label:"Says",icon:l.messageCircle,color:"#3b82f6"},thinks:{label:"Thinks",icon:l.lightbulb,color:"#8b5cf6"},does:{label:"Does",icon:l.wrench,color:"#f59e0b"},feels:{label:"Feels",icon:l.heart,color:"#ef4444"}},q={delighted:{emoji:"\u{1F604}",score:.95,color:"#16a34a"},satisfied:{emoji:"\u{1F60A}",score:.8,color:"#22c55e"},hopeful:{emoji:"\u{1F642}",score:.68,color:"#84cc16"},curious:{emoji:"\u{1F914}",score:.55,color:"#eab308"},neutral:{emoji:"\u{1F610}",score:.5,color:"#94a3b8"},uncertain:{emoji:"\u{1F615}",score:.4,color:"#f97316"},confused:{emoji:"\u{1F635}",score:.3,color:"#fb923c"},frustrated:{emoji:"\u{1F624}",score:.18,color:"#ef4444"},angry:{emoji:"\u{1F620}",score:.05,color:"#dc2626"}};var b=["says","thinks","does","feels"],v=class extends HTMLElement{static get observedAttributes(){return["persona","persona-id","src","editable","compact"]}#t=new Map;constructor(){super(),this.attachShadow({mode:"open"}),this.__quadrants=null,this.__goals=null,this.__painPoints=null,this._editingQuadrants=new Set}get quadrants(){return this.__quadrants}set quadrants(t){this.__quadrants=t,this.isConnected&&this._render()}get goals(){return this.__goals}set goals(t){this.__goals=t,this.isConnected&&this._render()}get painPoints(){return this.__painPoints}set painPoints(t){this.__painPoints=t,this.isConnected&&this._render()}#e(){for(let t of this.children){let e=t.getAttribute("slot");e&&this.#t.set(e,t.textContent.trim())}}_resolve(t){return this.getAttribute(t)||this.#t.get(t)||""}connectedCallback(){this.#e(),this.setAttribute("data-upgraded",""),this.hasAttribute("src")?this._loadSrc(this.getAttribute("src")):this._render()}disconnectedCallback(){this.removeAttribute("data-upgraded")}attributeChangedCallback(t){this.isConnected&&(t==="src"?this._loadSrc(this.getAttribute("src")):this._render())}get data(){let t=this.querySelector('[slot="title"]'),e=this.querySelector('[slot="summary"]');return{persona:this.getAttribute("persona")||void 0,personaId:this.getAttribute("persona-id")||void 0,title:t?.textContent?.trim()||void 0,summary:e?.textContent?.trim()||void 0,quadrants:this.__quadrants||void 0,goals:this.__goals||void 0,painPoints:this.__painPoints||void 0}}set data(t){if(!(!t||typeof t!="object")){if(t.persona&&this.setAttribute("persona",String(t.persona)),t.personaId&&this.setAttribute("persona-id",String(t.personaId)),t.title&&!this.querySelector('[slot="title"]')){let e=document.createElement("h2");e.slot="title",e.textContent=t.title,this.appendChild(e)}if(t.summary&&!this.querySelector('[slot="summary"]')){let e=document.createElement("p");e.slot="summary",e.textContent=t.summary,this.appendChild(e)}t.quadrants!=null&&(this.__quadrants=t.quadrants),t.goals!=null&&(this.__goals=t.goals),t.painPoints!=null&&(this.__painPoints=t.painPoints),this.isConnected&&this._render(),this.dispatchEvent(new CustomEvent("empathy-map:data-changed",{detail:{data:this.data,source:"property"},bubbles:!0,composed:!0}))}}editQuadrant(t){b.includes(t)&&this.hasAttribute("editable")&&this._openEdit(t)}closeQuadrant(t){b.includes(t)&&this._closeEdit(t)}async _loadSrc(t){if(!(!t||!this.shadowRoot)){this.shadowRoot.innerHTML=`<style>${_}</style><div class="state-msg">Loading\u2026</div>`;try{let e=await fetch(t);if(!e.ok)throw new Error(`HTTP ${e.status}`);let a=await e.json();if(a.persona&&this.setAttribute("persona",a.persona),a.personaId&&this.setAttribute("persona-id",a.personaId),a.title&&!this.querySelector('[slot="title"]')){let r=document.createElement("h2");r.slot="title",r.textContent=a.title,this.appendChild(r)}if(a.summary&&!this.querySelector('[slot="summary"]')){let r=document.createElement("p");r.slot="summary",r.textContent=a.summary,this.appendChild(r)}this.__quadrants=a.quadrants||null,this.__goals=a.goals||null,this.__painPoints=a.painPoints||null,this._render()}catch(e){if(!this.shadowRoot)return;let a=e instanceof Error?e.message:String(e);this.shadowRoot.innerHTML=`<style>${_}</style><div class="state-msg state-msg--error">Could not load empathy map: ${c(a)}</div>`}}}_render(){let t=this._resolve("persona")||"",e=this._resolve("persona-id")||"",a=this.hasAttribute("compact"),r=this.hasAttribute("editable"),n=!!this.querySelector('[slot="title"]')||this.#t.has("title"),i=!!this.querySelector('[slot="summary"]')||this.#t.has("summary"),d=this.__goals?.length||this.querySelector('[slot="goals"]'),s=this.__painPoints?.length||this.querySelector('[slot="pain-points"]'),m=`<style>${_}</style>
517
515
  <article class="empathy-map${a?" empathy-map--compact":""}">
518
516
 
519
517
  <header class="empathy-map__header">
@@ -529,23 +527,23 @@ var m=`
529
527
  <div class="empathy-map__title-wrap">
530
528
  <slot name="title"><h2 class="empathy-map__title">Empathy Map</h2></slot>
531
529
  </div>
532
- ${s?'<div class="empathy-map__summary-wrap"><slot name="summary"></slot></div>':""}
530
+ ${i?'<div class="empathy-map__summary-wrap"><slot name="summary"></slot></div>':""}
533
531
  </header>
534
532
 
535
533
  <div class="empathy-map__grid">
536
- ${_.map(u=>this._renderQuadrant(u,n)).join("")}
534
+ ${b.map(h=>this._renderQuadrant(h,r)).join("")}
537
535
  </div>
538
536
 
539
- ${d||o?`
537
+ ${d||s?`
540
538
  <footer class="empathy-map__footer">
541
539
  ${this._renderSummaryRow("goals",p(l.target),"Goals")}
542
540
  ${this._renderSummaryRow("pain-points",p(l.alertTriangle),"Pain Points")}
543
541
  </footer>
544
542
  `:""}
545
543
 
546
- </article>`,n&&this._bindEditListeners(),this.dispatchEvent(new CustomEvent("empathy-map:ready",{bubbles:!0,composed:!0,detail:{title:this.querySelector('[slot="title"]')?.textContent?.trim()||"Empathy Map",persona:t}}))}_renderQuadrant(t,e){let a=h[t],n=this.__quadrants?.[t],r=this._editingQuadrants.has(t),s=n&&n.length?t==="feels"?n.map(o=>this._renderEmotion(o)).join(""):n.map(o=>`<p>${c(o)}</p>`).join(""):`<slot name="${t}"><p class="placeholder">Add ${a.label.toLowerCase()} items\u2026</p></slot>`,d=n?.length?n.join(`
544
+ </article>`,u=()=>{this.shadowRoot&&(this.shadowRoot.innerHTML=m,r&&this._bindEditListeners())};this.shadowRoot?.querySelector("article")?x(this,u,"em-vt"):u(),this.dispatchEvent(new CustomEvent("empathy-map:ready",{bubbles:!0,composed:!0,detail:{title:this.querySelector('[slot="title"]')?.textContent?.trim()||"Empathy Map",persona:t}}))}_renderQuadrant(t,e){let a=f[t],r=this.__quadrants?.[t],n=this._editingQuadrants.has(t),i=r&&r.length?t==="feels"?r.map(s=>this._renderEmotion(s)).join(""):r.map(s=>`<p>${c(s)}</p>`).join(""):`<slot name="${t}"><p class="placeholder">Add ${a.label.toLowerCase()} items\u2026</p></slot>`,d=r?.length?r.join(`
547
545
  `):"";return`
548
- <section class="quadrant quadrant--${t}"${r?" data-editing":""}>
546
+ <section class="quadrant quadrant--${t}"${n?" data-editing":""}>
549
547
  <div class="quadrant__inner">
550
548
  <div class="quadrant__header">
551
549
  <div class="quadrant__icon" aria-hidden="true">${p(a.icon)}</div>
@@ -554,13 +552,13 @@ var m=`
554
552
  aria-label="Edit ${a.label}" title="Edit ${a.label}">${p(l.pencil)}</button>`:""}
555
553
  </div>
556
554
  <div class="quadrant__faces">
557
- <div class="quadrant__face quadrant__face--front"${r?" inert":""}>
555
+ <div class="quadrant__face quadrant__face--front"${n?" inert":""}>
558
556
  <div class="quadrant__content">
559
- ${s}
557
+ ${i}
560
558
  </div>
561
559
  </div>
562
560
  ${e?`
563
- <div class="quadrant__face quadrant__face--back"${r?"":" inert"}>
561
+ <div class="quadrant__face quadrant__face--back"${n?"":" inert"}>
564
562
  <textarea class="quadrant__editor" data-quadrant="${t}"
565
563
  placeholder="One item per line\u2026"
566
564
  aria-label="Edit ${a.label} items">${c(d)}</textarea>
@@ -570,15 +568,15 @@ var m=`
570
568
  `:""}
571
569
  </div>
572
570
  </div>
573
- </section>`}_renderEmotion(t){let e=t.toLowerCase().trim(),a=x[e];return a?`<span class="emotion-tag" style="--ec:${a.color}"><span role="img" aria-label="${c(t)}">${a.emoji}</span> ${c(t)}</span>`:`<p>${c(t)}</p>`}_renderSummaryRow(t,e,a){let r=(t==="pain-points"?"painPoints":t)==="painPoints"?this.__painPoints:this.__goals,s=r?.length?r.map(d=>`<p>${c(d)}</p>`).join(""):`<slot name="${t}"><p class="placeholder">No ${a.toLowerCase()} specified.</p></slot>`;return`
571
+ </section>`}_renderEmotion(t){let e=t.toLowerCase().trim(),a=q[e];return a?`<span class="emotion-tag" style="--ec:${a.color}"><span role="img" aria-label="${c(t)}">${a.emoji}</span> ${c(t)}</span>`:`<p>${c(t)}</p>`}_renderSummaryRow(t,e,a){let n=(t==="pain-points"?"painPoints":t)==="painPoints"?this.__painPoints:this.__goals,i=n?.length?n.map(d=>`<p>${c(d)}</p>`).join(""):`<slot name="${t}"><p class="placeholder">No ${a.toLowerCase()} specified.</p></slot>`;return`
574
572
  <div class="summary-row">
575
573
  <span class="summary-row__icon" aria-hidden="true">${e}</span>
576
574
  <div class="summary-row__body">
577
575
  <div class="summary-row__label">${a}</div>
578
- <div class="summary-row__content">${s}</div>
576
+ <div class="summary-row__content">${i}</div>
579
577
  </div>
580
- </div>`}_bindEditListeners(){let t=this.shadowRoot;t.querySelectorAll(".quadrant__edit-btn").forEach(e=>{e.addEventListener("click",()=>{this._openEdit(e.dataset.quadrant)})}),t.querySelectorAll(".quadrant__done-btn").forEach(e=>{e.addEventListener("click",()=>{this._closeEdit(e.dataset.quadrant)})}),t.querySelectorAll(".quadrant__editor").forEach(e=>{e.addEventListener("keydown",a=>{a.key==="Escape"&&(a.preventDefault(),this._closeEdit(e.dataset.quadrant))})})}_openEdit(t){this._editingQuadrants.add(t);let e=this.shadowRoot.querySelector(`.quadrant--${t}`);if(!e)return;e.setAttribute("data-editing","");let a=e.querySelector(".quadrant__face--front"),n=e.querySelector(".quadrant__face--back");a&&a.setAttribute("inert",""),n&&n.removeAttribute("inert");let r=e.querySelector(".quadrant__editor");if(r){let s=this.__quadrants?.[t];if(s?.length)r.value=s.join(`
581
- `);else{let d=e.querySelector(`slot[name="${t}"]`);if(d){let o=d.assignedElements();if(o.length){let u=[];o.forEach(b=>{let g=b.querySelectorAll("li");g.length?g.forEach(q=>u.push(q.textContent.trim())):u.push(b.textContent.trim())}),r.value=u.filter(Boolean).join(`
582
- `)}}}r.focus()}}_closeEdit(t){let e=this.shadowRoot.querySelector(`.quadrant--${t}`);if(!e)return;let a=e.querySelector(".quadrant__editor");if(a){let s=a.value.split(`
583
- `).map(o=>o.trim()).filter(Boolean);this.__quadrants||(this.__quadrants={}),this.__quadrants[t]=s;let d=e.querySelector(".quadrant__content");if(d)if(s.length)d.innerHTML=t==="feels"?s.map(o=>this._renderEmotion(o)).join(""):s.map(o=>`<p>${c(o)}</p>`).join("");else{let o=h[t];d.innerHTML=`<p class="placeholder">Add ${o.label.toLowerCase()} items\u2026</p>`}}this._editingQuadrants.delete(t),e.removeAttribute("data-editing");let n=e.querySelector(".quadrant__face--front"),r=e.querySelector(".quadrant__face--back");n&&n.removeAttribute("inert"),r&&r.setAttribute("inert",""),this.dispatchEvent(new CustomEvent("empathy-map:update",{bubbles:!0,composed:!0,detail:{quadrant:t,items:this.__quadrants?.[t]||[]}}))}};y("empathy-map",f);export{f as EmpathyMap};
578
+ </div>`}_bindEditListeners(){let t=this.shadowRoot;t&&(t.querySelectorAll(".quadrant__edit-btn").forEach(e=>{e.addEventListener("click",()=>{let a=e.dataset.quadrant;a&&this._openEdit(a)})}),t.querySelectorAll(".quadrant__done-btn").forEach(e=>{e.addEventListener("click",()=>{let a=e.dataset.quadrant;a&&this._closeEdit(a)})}),t.querySelectorAll(".quadrant__editor").forEach(e=>{let a=e;a.addEventListener("keydown",r=>{let n=r;if(n.key==="Escape"){n.preventDefault();let i=a.dataset.quadrant;i&&this._closeEdit(i)}})}))}_openEdit(t){this._editingQuadrants.add(t);let e=this.shadowRoot?.querySelector(`.quadrant--${t}`);if(!e)return;e.setAttribute("data-editing","");let a=e.querySelector(".quadrant__face--front"),r=e.querySelector(".quadrant__face--back");a&&a.setAttribute("inert",""),r&&r.removeAttribute("inert");let n=e.querySelector(".quadrant__editor");if(n){let i=this.__quadrants?.[t];if(i?.length)n.value=i.join(`
579
+ `);else{let d=e.querySelector(`slot[name="${t}"]`);if(d){let s=d.assignedElements();if(s.length){let m=[];s.forEach(u=>{let h=u.querySelectorAll("li");h.length?h.forEach(w=>m.push(w.textContent?.trim()??"")):m.push(u.textContent?.trim()??"")}),n.value=m.filter(Boolean).join(`
580
+ `)}}}n.focus()}}_closeEdit(t){let e=this.shadowRoot?.querySelector(`.quadrant--${t}`);if(!e)return;let a=e.querySelector(".quadrant__editor");if(a){let i=a.value.split(`
581
+ `).map(s=>s.trim()).filter(Boolean);this.__quadrants||(this.__quadrants={}),this.__quadrants[t]=i;let d=e.querySelector(".quadrant__content");if(d)if(i.length)d.innerHTML=t==="feels"?i.map(s=>this._renderEmotion(s)).join(""):i.map(s=>`<p>${c(s)}</p>`).join("");else{let s=f[t];d.innerHTML=`<p class="placeholder">Add ${s.label.toLowerCase()} items\u2026</p>`}}this._editingQuadrants.delete(t),e.removeAttribute("data-editing");let r=e.querySelector(".quadrant__face--front"),n=e.querySelector(".quadrant__face--back");r&&r.removeAttribute("inert"),n&&n.setAttribute("inert",""),this.dispatchEvent(new CustomEvent("empathy-map:update",{bubbles:!0,composed:!0,detail:{quadrant:t,items:this.__quadrants?.[t]||[]}}))}};y("empathy-map",v);export{v as EmpathyMap};
584
582
  //# sourceMappingURL=empathy-map.js.map
@@ -1,2 +1,2 @@
1
- var E=window.matchMedia("(prefers-reduced-motion: reduce)");var p=new Map;function b(c,t,n={}){let e=n.priority??10,s={impl:t,bundle:n.bundle,contract:n.contract,priority:e},i=p.get(c);if(customElements.get(c)){if(!i||i.priority>=e){i&&i.priority===e&&i.impl!==t&&console.warn(`[VB Bundle] Tag <${c}> already registered by "${i.bundle}" (priority ${i.priority}). Skipping "${n.bundle}".`);return}console.warn(`[VB Bundle] Tag <${c}> defined by "${i.bundle}" cannot be replaced (customElements.define is permanent). "${n.bundle}" has higher priority but arrived late.`);return}if(i&&i.priority>=e){i.priority===e&&console.warn(`[VB Bundle] Tag <${c}> already registered by "${i.bundle}". Skipping "${n.bundle}" (first wins at equal priority).`);return}p.set(c,s),customElements.define(c,t)}var f=class extends HTMLElement{#t=[];connectedCallback(){this.hasAttribute("data-upgraded")||this.setup()!==!1&&this.setAttribute("data-upgraded","")}disconnectedCallback(){for(let t of this.#t)t();this.#t=[],this.removeAttribute("data-upgraded"),this.teardown()}listen(t,n,e,s){t.addEventListener(n,e,s),this.#t.push(()=>t.removeEventListener(n,e,s))}setup(){}teardown(){}};var m=class extends f{static get observedAttributes(){return["src","title","compact"]}#t=null;#n=null;#e=null;#s=0;setup(){let t=this.querySelector(":scope > ol");if(!t)return!1;let n=this.#i(t);if(n.length===0)return!1;t.style.display="none",t.setAttribute("aria-hidden","true");let e=this.getAttribute("title");e&&(this.#n=document.createElement("h2"),this.#n.className="fd-title",this.#n.textContent=e,this.insertBefore(this.#n,t)),this.#t=document.createElement("div"),this.#t.className="fd-container",this.#t.setAttribute("role","img"),this.#t.setAttribute("aria-label",`Flow diagram${e?": "+e:""}`),this.#s=0,this.#o(n,this.#t);let s=document.createElement("div");s.className="fd-summary",s.textContent=`${this.#s} step${this.#s!==1?"s":""}`,this.#t.appendChild(s),this.insertBefore(this.#t,t),this.#e=document.createElement("div"),this.#e.className="fd-live",this.#e.setAttribute("role","status"),this.#e.setAttribute("aria-live","polite"),this.#e.setAttribute("aria-atomic","true"),this.appendChild(this.#e),this.listen(this.#t,"click",i=>{let o=i.target.closest(".fd-node-shape");if(!o)return;let a=o.closest(".fd-node")?.dataset.type||"action",d=o.textContent?.trim()||"";this.#l(`Selected: ${d}`),this.dispatchEvent(new CustomEvent("flow-diagram:select",{bubbles:!0,detail:{type:a,text:d}}))}),this.dispatchEvent(new CustomEvent("flow-diagram:ready",{bubbles:!0,detail:{nodeCount:this.#s}}))}teardown(){this.#n&&(this.#n.remove(),this.#n=null),this.#t&&(this.#t.remove(),this.#t=null),this.#e&&(this.#e.remove(),this.#e=null);let t=this.querySelector("ol");t&&(t.style.display="",t.removeAttribute("aria-hidden")),this.#s=0}attributeChangedCallback(t,n,e){n===e||!this.isConnected||(t==="src"?this._loadSrc(e):this.hasAttribute("data-upgraded")&&(this.teardown(),this.removeAttribute("data-upgraded"),this.setup()))}#i(t){let n=[];for(let e of t.querySelectorAll(":scope > li")){let s=this.#c(e);s&&n.push(s)}return n}#c(t){let n=t.dataset.type||"action",e=t.dataset.annotation||"",s=[],i=t.querySelectorAll(":scope > ol > li[data-branch]");if(i.length>0)for(let r of i){let a=r.dataset.branch||"",d=r.querySelector(":scope > ol"),l=d?this.#i(d):[];s.push({label:a,steps:l})}let o="";for(let r of t.childNodes)(r.nodeType===Node.TEXT_NODE||r.nodeType===Node.ELEMENT_NODE&&r.tagName!=="OL")&&(o+=r.textContent);return o=o.trim(),{type:n,text:o,annotation:e,branches:s}}#o(t,n){for(let e=0;e<t.length;e++){let s=t[e];e>0&&n.appendChild(this.#r());let i=this.#d(s);if(n.appendChild(i),s.branches.length>0){let o=document.createElement("div");o.className="fd-branches",o.setAttribute("data-branch-count",String(s.branches.length));let r=document.createElement("div");r.className="fd-split-line",r.setAttribute("aria-hidden","true"),o.appendChild(r);let a=document.createElement("div");a.className="fd-branch-columns";let d=(50/s.branches.length).toFixed(2);a.style.setProperty("--fd-inset",`${d}%`);for(let l of s.branches){let h=document.createElement("div");h.className="fd-branch",h.appendChild(this.#r());let u=document.createElement("span");u.className="fd-branch-label",u.textContent=l.label,u.setAttribute("data-branch",l.label.toLowerCase()),h.appendChild(u),this.#o(l.steps,h),a.appendChild(h)}o.appendChild(a),n.appendChild(o)}}}#d(t){this.#s++;let n=document.createElement("div");n.className="fd-node",n.dataset.type=t.type;let e=document.createElement("div");if(e.className="fd-node-shape",e.setAttribute("tabindex","0"),e.setAttribute("role","img"),e.setAttribute("aria-label",`${t.type}: ${t.text}`),e.textContent=t.text,n.appendChild(e),t.annotation){let s=document.createElement("div");s.className="fd-annotation",s.textContent=t.annotation,n.appendChild(s)}return n}#r(t){let n=document.createElement("div");n.className="fd-connector",n.setAttribute("aria-hidden","true");let e=document.createElement("div");if(e.className="fd-connector-line",n.appendChild(e),t){let i=document.createElement("span");i.className="fd-connector-label",i.textContent=t,n.appendChild(i)}let s=document.createElement("div");return s.className="fd-connector-arrow",n.appendChild(s),n}async _loadSrc(t){if(t)try{let n=await fetch(t);if(!n.ok)throw new Error(`HTTP ${n.status}`);let e=await n.json();for(;this.firstChild;)this.firstChild.remove();e.title&&this.setAttribute("title",e.title);let s=document.createElement("ol");this.#a(e.steps||[],s),this.appendChild(s),this.teardown(),this.removeAttribute("data-upgraded"),this.setup()}catch(n){console.warn(`[flow-diagram] Failed to load src="${t}":`,n)}}#a(t,n){for(let e of t){let s=document.createElement("li");if(e.type&&(s.dataset.type=e.type),e.annotation&&(s.dataset.annotation=e.annotation),s.textContent=e.text||"",e.branches&&e.branches.length>0){let i=document.createElement("ol");for(let o of e.branches){let r=document.createElement("li");r.dataset.branch=o.label||"";let a=document.createElement("ol");this.#a(o.steps||[],a),r.appendChild(a),i.appendChild(r)}s.appendChild(i)}n.appendChild(s)}}#l(t){this.#e&&(this.#e.textContent="",requestAnimationFrame(()=>{this.#e&&(this.#e.textContent=t)}))}};b("flow-diagram",m);export{m as FlowDiagram};
1
+ var y=window.matchMedia("(prefers-reduced-motion: reduce)");var p=new Map;function b(c,e,s={}){let t=s.priority??10,n={impl:e,bundle:s.bundle,contract:s.contract,priority:t},i=p.get(c);if(customElements.get(c)){if(!i||i.priority>=t){i&&i.priority===t&&i.impl!==e&&console.warn(`[VB Bundle] Tag <${c}> already registered by "${i.bundle}" (priority ${i.priority}). Skipping "${s.bundle}".`);return}console.warn(`[VB Bundle] Tag <${c}> defined by "${i.bundle}" cannot be replaced (customElements.define is permanent). "${s.bundle}" has higher priority but arrived late.`);return}if(i&&i.priority>=t){i.priority===t&&console.warn(`[VB Bundle] Tag <${c}> already registered by "${i.bundle}". Skipping "${s.bundle}" (first wins at equal priority).`);return}p.set(c,n),customElements.define(c,e)}var m=class extends HTMLElement{#t=[];#s;connectedCallback(){this.hasAttribute("data-upgraded")||this.setup()!==!1&&(this.setAttribute("data-upgraded",""),queueMicrotask(()=>{this.dispatchEvent(new CustomEvent(`${this.localName}:upgraded`,{bubbles:!0}))}))}disconnectedCallback(){for(let e of this.#t)e();this.#t=[],this.removeAttribute("data-upgraded"),this.teardown()}listen(e,s,t,n){e.addEventListener(s,t,n),this.#t.push(()=>e.removeEventListener(s,t,n))}setup(){}teardown(){}setState(e,s){this.#s||(this.#s=this.attachInternals());let t=this.#s.states;try{s?t.add(e):t.delete(e)}catch{let n=`--${e}`;s?t.add(n):t.delete(n)}}_adoptInternals(e){this.#s||(this.#s=e)}};var f=class c extends m{static get observedAttributes(){return["src","title","compact"]}#t=null;#s=null;#e=null;#n=0;#i=[];setup(){let e=this.querySelector(":scope > ol");if(!e)return!1;let s=this.#a(e);if(s.length===0)return!1;this.#i=s,e.style.display="none",e.setAttribute("aria-hidden","true");let t=this.getAttribute("title");t&&(this.#s=document.createElement("h2"),this.#s.className="fd-title",this.#s.textContent=t,this.insertBefore(this.#s,e)),this.#t=document.createElement("div"),this.#t.className="fd-container",this.#t.setAttribute("role","img"),this.#t.setAttribute("aria-label",`Flow diagram${t?": "+t:""}`),this.#n=0,this.#o(s,this.#t);let n=document.createElement("div");return n.className="fd-summary",n.textContent=`${this.#n} step${this.#n!==1?"s":""}`,this.#t.appendChild(n),this.insertBefore(this.#t,e),this.#e=document.createElement("div"),this.#e.className="fd-live",this.#e.setAttribute("role","status"),this.#e.setAttribute("aria-live","polite"),this.#e.setAttribute("aria-atomic","true"),this.appendChild(this.#e),this.listen(this.#t,"click",i=>{let o=i.target.closest(".fd-node-shape");if(!o)return;let a=o.closest(".fd-node")?.dataset.type||"action",l=o.textContent?.trim()||"";this.#m(`Selected: ${l}`),this.dispatchEvent(new CustomEvent("flow-diagram:select",{bubbles:!0,detail:{type:a,text:l}}))}),this.dispatchEvent(new CustomEvent("flow-diagram:ready",{bubbles:!0,detail:{nodeCount:this.#n}})),!0}teardown(){this.#s&&(this.#s.remove(),this.#s=null),this.#t&&(this.#t.remove(),this.#t=null),this.#e&&(this.#e.remove(),this.#e=null);let e=this.querySelector("ol");e&&(e.style.display="",e.removeAttribute("aria-hidden")),this.#n=0}static#d=0;attributeChangedCallback(e,s,t){s===t||!this.isConnected||(e==="src"?this._loadSrc(t):this.hasAttribute("data-upgraded")&&this.#r())}#r(){let e=()=>{this.teardown(),this.removeAttribute("data-upgraded"),this.setup()};if(this.hasAttribute("data-upgraded")&&"startViewTransition"in document&&!matchMedia("(prefers-reduced-motion: reduce)").matches){let s=`fd-vt-${++c.#d}`;this.style.viewTransitionName=s,document.startViewTransition(e).finished.finally(()=>{this.style.viewTransitionName=""})}else e()}get steps(){return this.#i}set steps(e){let s=Array.isArray(e)?e:[];this.#i=s,this.#s&&(this.#s.remove(),this.#s=null),this.#t&&(this.#t.remove(),this.#t=null),this.#e&&(this.#e.remove(),this.#e=null);let t=this.querySelector(":scope > ol");if(t||(t=document.createElement("ol"),t.style.display="none",t.setAttribute("aria-hidden","true"),this.appendChild(t)),s.length===0){this.dispatchEvent(new CustomEvent("flow-diagram:steps-changed",{detail:{steps:s,source:"property"},bubbles:!0}));return}let n=this.getAttribute("title");n&&(this.#s=document.createElement("h2"),this.#s.className="fd-title",this.#s.textContent=n,this.insertBefore(this.#s,t)),this.#t=document.createElement("div"),this.#t.className="fd-container",this.#t.setAttribute("role","img"),this.#t.setAttribute("aria-label",`Flow diagram${n?": "+n:""}`),this.#n=0,this.#o(s,this.#t);let i=document.createElement("div");i.className="fd-summary",i.textContent=`${this.#n} step${this.#n!==1?"s":""}`,this.#t.appendChild(i),this.insertBefore(this.#t,t),this.#e=document.createElement("div"),this.#e.className="fd-live",this.#e.setAttribute("role","status"),this.#e.setAttribute("aria-live","polite"),this.#e.setAttribute("aria-atomic","true"),this.appendChild(this.#e),this.dispatchEvent(new CustomEvent("flow-diagram:steps-changed",{detail:{steps:s,source:"property"},bubbles:!0}))}#a(e){let s=[];for(let t of e.querySelectorAll(":scope > li")){let n=this.#h(t);n&&s.push(n)}return s}#h(e){let s=e.dataset.type||"action",t=e.dataset.annotation||"",n=[],i=e.querySelectorAll(":scope > ol > li[data-branch]");if(i.length>0)for(let r of i){let a=r.dataset.branch||"",l=r.querySelector(":scope > ol"),d=l?this.#a(l):[];n.push({label:a,steps:d})}let o="";for(let r of e.childNodes)(r.nodeType===Node.TEXT_NODE||r.nodeType===Node.ELEMENT_NODE&&r.tagName!=="OL")&&(o+=r.textContent);return o=o.trim(),{type:s,text:o,annotation:t,branches:n}}#o(e,s){for(let t=0;t<e.length;t++){let n=e[t];t>0&&s.appendChild(this.#c());let i=this.#u(n);if(s.appendChild(i),n.branches.length>0){let o=document.createElement("div");o.className="fd-branches",o.setAttribute("data-branch-count",String(n.branches.length));let r=document.createElement("div");r.className="fd-split-line",r.setAttribute("aria-hidden","true"),o.appendChild(r);let a=document.createElement("div");a.className="fd-branch-columns";let l=(50/n.branches.length).toFixed(2);a.style.setProperty("--fd-inset",`${l}%`);for(let d of n.branches){let h=document.createElement("div");h.className="fd-branch",h.appendChild(this.#c());let u=document.createElement("span");u.className="fd-branch-label",u.textContent=d.label,u.setAttribute("data-branch",d.label.toLowerCase()),h.appendChild(u),this.#o(d.steps,h),a.appendChild(h)}o.appendChild(a),s.appendChild(o)}}}#u(e){this.#n++;let s=document.createElement("div");s.className="fd-node",s.dataset.type=e.type;let t=document.createElement("div");if(t.className="fd-node-shape",t.setAttribute("tabindex","0"),t.setAttribute("role","img"),t.setAttribute("aria-label",`${e.type}: ${e.text}`),t.textContent=e.text,s.appendChild(t),e.annotation){let n=document.createElement("div");n.className="fd-annotation",n.textContent=e.annotation,s.appendChild(n)}return s}#c(e){let s=document.createElement("div");s.className="fd-connector",s.setAttribute("aria-hidden","true");let t=document.createElement("div");if(t.className="fd-connector-line",s.appendChild(t),e){let i=document.createElement("span");i.className="fd-connector-label",i.textContent=e,s.appendChild(i)}let n=document.createElement("div");return n.className="fd-connector-arrow",s.appendChild(n),s}async _loadSrc(e){if(e)try{let s=await fetch(e);if(!s.ok)throw new Error(`HTTP ${s.status}`);let t=await s.json();for(;this.firstChild;)this.firstChild.remove();t.title&&this.setAttribute("title",t.title);let n=document.createElement("ol");this.#l(t.steps||[],n),this.appendChild(n),this.#r()}catch(s){console.warn(`[flow-diagram] Failed to load src="${e}":`,s)}}#l(e,s){for(let t of e){let n=document.createElement("li");if(t.type&&(n.dataset.type=t.type),t.annotation&&(n.dataset.annotation=t.annotation),n.textContent=t.text||"",t.branches&&t.branches.length>0){let i=document.createElement("ol");for(let o of t.branches){let r=document.createElement("li");r.dataset.branch=o.label||"";let a=document.createElement("ol");this.#l(o.steps||[],a),r.appendChild(a),i.appendChild(r)}n.appendChild(i)}s.appendChild(n)}}#m(e){this.#e&&(this.#e.textContent="",requestAnimationFrame(()=>{this.#e&&(this.#e.textContent=e)}))}};b("flow-diagram",f);export{f as FlowDiagram};
2
2
  //# sourceMappingURL=flow-diagram.js.map
@@ -1,108 +1,108 @@
1
- var D=window.matchMedia("(prefers-reduced-motion: reduce)");var w=new Map;function x(t,e,i={}){let o=i.priority??10,r={impl:e,bundle:i.bundle,contract:i.contract,priority:o},s=w.get(t);if(customElements.get(t)){if(!s||s.priority>=o){s&&s.priority===o&&s.impl!==e&&console.warn(`[VB Bundle] Tag <${t}> already registered by "${s.bundle}" (priority ${s.priority}). Skipping "${i.bundle}".`);return}console.warn(`[VB Bundle] Tag <${t}> defined by "${s.bundle}" cannot be replaced (customElements.define is permanent). "${i.bundle}" has higher priority but arrived late.`);return}if(s&&s.priority>=o){s.priority===o&&console.warn(`[VB Bundle] Tag <${t}> already registered by "${s.bundle}". Skipping "${i.bundle}" (first wins at equal priority).`);return}w.set(t,r),customElements.define(t,e)}var p=class extends HTMLElement{#e=[];connectedCallback(){this.hasAttribute("data-upgraded")||this.setup()!==!1&&this.setAttribute("data-upgraded","")}disconnectedCallback(){for(let e of this.#e)e();this.#e=[],this.removeAttribute("data-upgraded"),this.teardown()}listen(e,i,o,r){e.addEventListener(i,o,r),this.#e.push(()=>e.removeEventListener(i,o,r))}setup(){}teardown(){}};var f=[{name:"Playfair Display",category:"serif",weights:"400;600;700;900",style:"elegant"},{name:"Merriweather",category:"serif",weights:"300;400;700;900",style:"readable"},{name:"Lora",category:"serif",weights:"400;500;600;700",style:"elegant"},{name:"Source Serif 4",category:"serif",weights:"300;400;600;700",style:"neutral"},{name:"Libre Baskerville",category:"serif",weights:"400;700",style:"classic"},{name:"Crimson Text",category:"serif",weights:"400;600;700",style:"classic"},{name:"DM Serif Display",category:"serif",weights:"400",style:"bold"},{name:"Cormorant Garamond",category:"serif",weights:"300;400;500;600;700",style:"elegant"},{name:"Inter",category:"sans-serif",weights:"300;400;500;600;700",style:"neutral"},{name:"Open Sans",category:"sans-serif",weights:"300;400;600;700",style:"friendly"},{name:"Roboto",category:"sans-serif",weights:"300;400;500;700",style:"neutral"},{name:"Lato",category:"sans-serif",weights:"300;400;700;900",style:"warm"},{name:"Nunito",category:"sans-serif",weights:"300;400;600;700",style:"friendly"},{name:"Work Sans",category:"sans-serif",weights:"300;400;500;600;700",style:"geometric"},{name:"DM Sans",category:"sans-serif",weights:"400;500;700",style:"geometric"},{name:"Plus Jakarta Sans",category:"sans-serif",weights:"300;400;500;600;700",style:"modern"},{name:"Space Grotesk",category:"sans-serif",weights:"300;400;500;600;700",style:"technical"},{name:"Manrope",category:"sans-serif",weights:"300;400;500;600;700",style:"geometric"},{name:"IBM Plex Sans",category:"sans-serif",weights:"300;400;500;600",style:"technical"},{name:"Outfit",category:"sans-serif",weights:"300;400;500;600;700",style:"modern"},{name:"Bebas Neue",category:"display",weights:"400",style:"bold"},{name:"Abril Fatface",category:"display",weights:"400",style:"elegant"},{name:"Oswald",category:"display",weights:"300;400;500;600;700",style:"condensed"},{name:"Sora",category:"display",weights:"300;400;500;600;700",style:"modern"},{name:"Fraunces",category:"display",weights:"300;400;500;600;700;900",style:"elegant"},{name:"JetBrains Mono",category:"monospace",weights:"400;500;600;700",style:"technical"},{name:"Fira Code",category:"monospace",weights:"300;400;500;600;700",style:"technical"},{name:"IBM Plex Mono",category:"monospace",weights:"400;500;600",style:"technical"},{name:"Source Code Pro",category:"monospace",weights:"300;400;500;600;700",style:"neutral"}],z=[["Playfair Display","Inter"],["DM Serif Display","DM Sans"],["Fraunces","Plus Jakarta Sans"],["Lora","Open Sans"],["Merriweather","Roboto"],["Oswald","Lato"],["Cormorant Garamond","Work Sans"],["Sora","Inter"],["Abril Fatface","Nunito"],["Source Serif 4","Source Code Pro"],["Space Grotesk","IBM Plex Sans"],["Outfit","Manrope"]];function g(t,e="400;700"){return`https://fonts.googleapis.com/css2?family=${t.replace(/\s+/g,"+")}:wght@${e}&display=swap`}async function k(t,e="400;700"){let i=`gf-${t.replace(/\s+/g,"-").toLowerCase()}`;if(document.getElementById(i)){await document.fonts.ready;return}let o=document.createElement("link");o.id=i,o.rel="stylesheet",o.href=g(t,e),document.head.appendChild(o),await document.fonts.ready}var n=(t,e,i,o="")=>`${o} contenteditable="plaintext-only" spellcheck="false" class="fp-editable" data-role="${i}"`,u={combined:{label:"Combined",render:(t,e)=>`
2
- <p style="font-family:${t.display};font-size:var(--font-size-3xl,2rem);font-weight:800;margin:0;line-height:1.15"
3
- ${n(t.display,"p","heading")}>${e.heading}</p>
4
- <h3 style="font-family:${t.heading};font-size:var(--font-size-lg,1.125rem);font-weight:600;margin:0"
5
- ${n(t.heading,"h3","subheading")}>${e.subheading}</h3>
6
- <p style="font-family:${t.body};font-size:var(--font-size-md,1rem);line-height:1.65;margin:0;color:var(--color-text-muted,#666)"
7
- ${n(t.body,"p","body")}>${e.body}</p>
8
- <pre style="font-family:${t.code};font-size:var(--font-size-sm,0.875rem);line-height:1.5;margin:0;padding:var(--size-s,0.75rem);background:var(--color-surface-sunken,#eee);border-radius:var(--radius-s,0.25rem);overflow-x:auto"><code ${n(t.code,"code","code")}>${e.code}</code></pre>`},article:{label:"Article",render:(t,e)=>`
9
- <small style="font-family:${t.body};font-size:var(--font-size-xs,0.75rem);text-transform:uppercase;letter-spacing:0.08em;color:var(--color-interactive,oklch(55% .2 260));font-weight:600"
10
- ${n(t.body,"small","eyebrow")}>${e.eyebrow}</small>
11
- <h2 style="font-family:${t.heading};font-size:var(--font-size-2xl,1.75rem);font-weight:700;margin:0;line-height:1.2"
12
- ${n(t.heading,"h2","heading")}>${e.heading}</h2>
13
- <p style="font-family:${t.body};font-size:var(--font-size-sm,0.875rem);color:var(--color-text-muted,#666);margin:0"
14
- ${n(t.body,"p","byline")}>${e.byline}</p>
15
- <p style="font-family:${t.body};line-height:1.7;margin:0" ${n(t.body,"p","body")}>${e.body}</p>
16
- <h3 style="font-family:${t.heading};font-size:var(--font-size-lg,1.125rem);font-weight:600;margin:0"
17
- ${n(t.heading,"h3","subheading")}>${e.subheading}</h3>
18
- <p style="font-family:${t.body};line-height:1.7;margin:0" ${n(t.body,"p","body2")}>${e.body2}</p>
19
- <blockquote style="font-family:${t.display};font-style:italic;font-size:var(--font-size-lg,1.125rem);border-inline-start:3px solid var(--color-interactive,oklch(55% .2 260));padding-inline-start:var(--size-m,1rem);margin:0;color:var(--color-text-muted,#666)"
20
- ${n(t.display,"blockquote","quote")}>${e.quote}</blockquote>
21
- <pre style="font-family:${t.code};font-size:var(--font-size-sm,0.875rem);line-height:1.5;margin:0;padding:var(--size-s,0.75rem);background:var(--color-surface-sunken,#eee);border-radius:var(--radius-s,0.25rem);overflow-x:auto"><code ${n(t.code,"code","code")}>${e.code}</code></pre>`},"long-article":{label:"Long Article",render:(t,e)=>`
22
- <small style="font-family:${t.body};font-size:var(--font-size-xs,0.75rem);text-transform:uppercase;letter-spacing:0.08em;color:var(--color-interactive,oklch(55% .2 260));font-weight:600">${e.eyebrow}</small>
23
- <h1 style="font-family:${t.display};font-size:var(--font-size-3xl,2rem);font-weight:800;margin:0;line-height:1.15">${e.heading}</h1>
24
- <p style="font-family:${t.body};font-size:var(--font-size-sm,0.875rem);color:var(--color-text-muted,#666);margin:0">${e.byline}</p>
25
- <p style="font-family:${t.body};font-size:var(--font-size-lg,1.125rem);line-height:1.6;margin:0;color:var(--color-text-muted,#666)">${e.lead}</p>
26
- <h2 style="font-family:${t.heading};font-size:var(--font-size-xl,1.375rem);font-weight:700;margin:0">${e.subheading}</h2>
27
- <p style="font-family:${t.body};line-height:1.7;margin:0">${e.body}</p>
28
- <p style="font-family:${t.body};line-height:1.7;margin:0">${e.body2}</p>
29
- <blockquote style="font-family:${t.display};font-style:italic;font-size:var(--font-size-lg,1.125rem);border-inline-start:3px solid var(--color-interactive,oklch(55% .2 260));padding-inline-start:var(--size-m,1rem);margin:0;color:var(--color-text-muted,#666)">${e.quote}</blockquote>
30
- <h2 style="font-family:${t.heading};font-size:var(--font-size-xl,1.375rem);font-weight:700;margin:0">Implementation Details</h2>
31
- <p style="font-family:${t.body};line-height:1.7;margin:0">Design tokens form the atomic layer of any visual system. Colors, spacing, typography, and motion are expressed as named variables that cascade through every component. When a token changes, every surface that references it updates automatically \u2014 no find-and-replace, no missed instances.</p>
32
- <pre style="font-family:${t.code};font-size:var(--font-size-sm,0.875rem);line-height:1.5;margin:0;padding:var(--size-s,0.75rem);background:var(--color-surface-sunken,#eee);border-radius:var(--radius-s,0.25rem);overflow-x:auto"><code>${e.code}</code></pre>
33
- <h3 style="font-family:${t.heading};font-size:var(--font-size-lg,1.125rem);font-weight:600;margin:0">Key Takeaways</h3>
34
- <ul style="font-family:${t.body};line-height:1.7;margin:0;padding-inline-start:1.5rem">
1
+ var W=window.matchMedia("(prefers-reduced-motion: reduce)");var S=new Map;function k(e,t,o={}){let i=o.priority??10,s={impl:t,bundle:o.bundle,contract:o.contract,priority:i},n=S.get(e);if(customElements.get(e)){if(!n||n.priority>=i){n&&n.priority===i&&n.impl!==t&&console.warn(`[VB Bundle] Tag <${e}> already registered by "${n.bundle}" (priority ${n.priority}). Skipping "${o.bundle}".`);return}console.warn(`[VB Bundle] Tag <${e}> defined by "${n.bundle}" cannot be replaced (customElements.define is permanent). "${o.bundle}" has higher priority but arrived late.`);return}if(n&&n.priority>=i){n.priority===i&&console.warn(`[VB Bundle] Tag <${e}> already registered by "${n.bundle}". Skipping "${o.bundle}" (first wins at equal priority).`);return}S.set(e,s),customElements.define(e,t)}var y=class extends HTMLElement{#e=[];#t;connectedCallback(){this.hasAttribute("data-upgraded")||this.setup()!==!1&&(this.setAttribute("data-upgraded",""),queueMicrotask(()=>{this.dispatchEvent(new CustomEvent(`${this.localName}:upgraded`,{bubbles:!0}))}))}disconnectedCallback(){for(let t of this.#e)t();this.#e=[],this.removeAttribute("data-upgraded"),this.teardown()}listen(t,o,i,s){t.addEventListener(o,i,s),this.#e.push(()=>t.removeEventListener(o,i,s))}setup(){}teardown(){}setState(t,o){this.#t||(this.#t=this.attachInternals());let i=this.#t.states;try{o?i.add(t):i.delete(t)}catch{let s=`--${t}`;o?i.add(s):i.delete(s)}}_adoptInternals(t){this.#t||(this.#t=t)}};var b="[data-copy], [data-copy-target], [data-paste-target]",U="Copied to clipboard",j="Pasted from clipboard",g=new WeakMap;async function h(e,t={}){if(e==null||e==="")return!1;let{button:o,announceMessage:i=U,duration:s=1500}=t;try{await navigator.clipboard.writeText(e)}catch{return!1}return T({button:o,duration:s,announceMessage:i,eventDetail:{text:e}}),!0}function T({button:e,duration:t,announceMessage:o,eventDetail:i,state:s="copied",eventName:n="copy"}){if(e){e.dataset.state=s;let a=g.get(e);a&&clearTimeout(a),g.set(e,setTimeout(()=>{delete e.dataset.state,g.delete(e)},t)),e.dispatchEvent(new CustomEvent(n,{bubbles:!0,detail:i}))}R(o,e??document.body)}async function _(e,t={}){let{button:o,announceMessage:i=j,duration:s=1500}=t,n;try{n=await navigator.clipboard.readText()}catch{return null}return e&&("value"in e&&(e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement||e instanceof HTMLSelectElement)?e.value=n:e.textContent=n,e.dispatchEvent(new Event("input",{bubbles:!0}))),T({button:o,duration:s,announceMessage:i,eventDetail:{text:n},state:"pasted",eventName:"paste"}),n}function C(e=document){e.querySelectorAll(b).forEach(v)}function v(e){e.hasAttribute("data-copy-init")||(e.setAttribute("data-copy-init",""),e.addEventListener("click",()=>{if(e.dataset.pasteTarget){let o=document.querySelector(e.dataset.pasteTarget);if(!o)return;_(o,{button:e});return}let t=G(e);t&&h(t,{button:e})}))}function G(e){if(e.dataset.copy)return e.dataset.copy;if(e.dataset.copyTarget){let t=document.querySelector(e.dataset.copyTarget);if(!t)return"";let o=e.dataset.copyAttr;return o?t.getAttribute(o)??"":t.textContent??""}return""}function R(e,t){let o=document.createElement("div");o.setAttribute("role","status"),o.setAttribute("aria-live","polite"),o.className="visually-hidden",o.textContent=e,t.appendChild(o),setTimeout(()=>o.remove(),1e3)}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>C()):C();var H=new MutationObserver(e=>{for(let t of e)for(let o of t.addedNodes){if(o.nodeType!==Node.ELEMENT_NODE)continue;let i=o;i.matches(b)&&v(i),i.querySelectorAll(b).forEach(s=>v(s))}});H.observe(document.documentElement,{childList:!0,subtree:!0});var m=[{name:"Playfair Display",category:"serif",weights:"400;600;700;900",style:"elegant"},{name:"Merriweather",category:"serif",weights:"300;400;700;900",style:"readable"},{name:"Lora",category:"serif",weights:"400;500;600;700",style:"elegant"},{name:"Source Serif 4",category:"serif",weights:"300;400;600;700",style:"neutral"},{name:"Libre Baskerville",category:"serif",weights:"400;700",style:"classic"},{name:"Crimson Text",category:"serif",weights:"400;600;700",style:"classic"},{name:"DM Serif Display",category:"serif",weights:"400",style:"bold"},{name:"Cormorant Garamond",category:"serif",weights:"300;400;500;600;700",style:"elegant"},{name:"Inter",category:"sans-serif",weights:"300;400;500;600;700",style:"neutral"},{name:"Open Sans",category:"sans-serif",weights:"300;400;600;700",style:"friendly"},{name:"Roboto",category:"sans-serif",weights:"300;400;500;700",style:"neutral"},{name:"Lato",category:"sans-serif",weights:"300;400;700;900",style:"warm"},{name:"Nunito",category:"sans-serif",weights:"300;400;600;700",style:"friendly"},{name:"Work Sans",category:"sans-serif",weights:"300;400;500;600;700",style:"geometric"},{name:"DM Sans",category:"sans-serif",weights:"400;500;700",style:"geometric"},{name:"Plus Jakarta Sans",category:"sans-serif",weights:"300;400;500;600;700",style:"modern"},{name:"Space Grotesk",category:"sans-serif",weights:"300;400;500;600;700",style:"technical"},{name:"Manrope",category:"sans-serif",weights:"300;400;500;600;700",style:"geometric"},{name:"IBM Plex Sans",category:"sans-serif",weights:"300;400;500;600",style:"technical"},{name:"Outfit",category:"sans-serif",weights:"300;400;500;600;700",style:"modern"},{name:"Bebas Neue",category:"display",weights:"400",style:"bold"},{name:"Abril Fatface",category:"display",weights:"400",style:"elegant"},{name:"Oswald",category:"display",weights:"300;400;500;600;700",style:"condensed"},{name:"Sora",category:"display",weights:"300;400;500;600;700",style:"modern"},{name:"Fraunces",category:"display",weights:"300;400;500;600;700;900",style:"elegant"},{name:"JetBrains Mono",category:"monospace",weights:"400;500;600;700",style:"technical"},{name:"Fira Code",category:"monospace",weights:"300;400;500;600;700",style:"technical"},{name:"IBM Plex Mono",category:"monospace",weights:"400;500;600",style:"technical"},{name:"Source Code Pro",category:"monospace",weights:"300;400;500;600;700",style:"neutral"}],A=[["Playfair Display","Inter"],["DM Serif Display","DM Sans"],["Fraunces","Plus Jakarta Sans"],["Lora","Open Sans"],["Merriweather","Roboto"],["Oswald","Lato"],["Cormorant Garamond","Work Sans"],["Sora","Inter"],["Abril Fatface","Nunito"],["Source Serif 4","Source Code Pro"],["Space Grotesk","IBM Plex Sans"],["Outfit","Manrope"]];function $(e,t="400;700"){return`https://fonts.googleapis.com/css2?family=${e.replace(/\s+/g,"+")}:wght@${t}&display=swap`}async function M(e,t="400;700"){let o=`gf-${e.replace(/\s+/g,"-").toLowerCase()}`;if(document.getElementById(o)){await document.fonts.ready;return}let i=document.createElement("link");i.id=o,i.rel="stylesheet",i.href=$(e,t),document.head.appendChild(i),await document.fonts.ready}var r=(e,t,o,i="")=>`${i} contenteditable="plaintext-only" spellcheck="false" class="fp-editable" data-role="${o}"`,w={combined:{label:"Combined",render:(e,t)=>`
2
+ <p style="font-family:${e.display};font-size:var(--font-size-3xl,2rem);font-weight:800;margin:0;line-height:1.15"
3
+ ${r(e.display,"p","heading")}>${t.heading}</p>
4
+ <h3 style="font-family:${e.heading};font-size:var(--font-size-lg,1.125rem);font-weight:600;margin:0"
5
+ ${r(e.heading,"h3","subheading")}>${t.subheading}</h3>
6
+ <p style="font-family:${e.body};font-size:var(--font-size-md,1rem);line-height:1.65;margin:0;color:var(--color-text-muted,#666)"
7
+ ${r(e.body,"p","body")}>${t.body}</p>
8
+ <pre style="font-family:${e.code};font-size:var(--font-size-sm,0.875rem);line-height:1.5;margin:0;padding:var(--size-s,0.75rem);background:var(--color-surface-sunken,#eee);border-radius:var(--radius-s,0.25rem);overflow-x:auto"><code ${r(e.code,"code","code")}>${t.code}</code></pre>`},article:{label:"Article",render:(e,t)=>`
9
+ <small style="font-family:${e.body};font-size:var(--font-size-xs,0.75rem);text-transform:uppercase;letter-spacing:0.08em;color:var(--color-interactive,oklch(55% .2 260));font-weight:600"
10
+ ${r(e.body,"small","eyebrow")}>${t.eyebrow}</small>
11
+ <h2 style="font-family:${e.heading};font-size:var(--font-size-2xl,1.75rem);font-weight:700;margin:0;line-height:1.2"
12
+ ${r(e.heading,"h2","heading")}>${t.heading}</h2>
13
+ <p style="font-family:${e.body};font-size:var(--font-size-sm,0.875rem);color:var(--color-text-muted,#666);margin:0"
14
+ ${r(e.body,"p","byline")}>${t.byline}</p>
15
+ <p style="font-family:${e.body};line-height:1.7;margin:0" ${r(e.body,"p","body")}>${t.body}</p>
16
+ <h3 style="font-family:${e.heading};font-size:var(--font-size-lg,1.125rem);font-weight:600;margin:0"
17
+ ${r(e.heading,"h3","subheading")}>${t.subheading}</h3>
18
+ <p style="font-family:${e.body};line-height:1.7;margin:0" ${r(e.body,"p","body2")}>${t.body2}</p>
19
+ <blockquote style="font-family:${e.display};font-style:italic;font-size:var(--font-size-lg,1.125rem);border-inline-start:3px solid var(--color-interactive,oklch(55% .2 260));padding-inline-start:var(--size-m,1rem);margin:0;color:var(--color-text-muted,#666)"
20
+ ${r(e.display,"blockquote","quote")}>${t.quote}</blockquote>
21
+ <pre style="font-family:${e.code};font-size:var(--font-size-sm,0.875rem);line-height:1.5;margin:0;padding:var(--size-s,0.75rem);background:var(--color-surface-sunken,#eee);border-radius:var(--radius-s,0.25rem);overflow-x:auto"><code ${r(e.code,"code","code")}>${t.code}</code></pre>`},"long-article":{label:"Long Article",render:(e,t)=>`
22
+ <small style="font-family:${e.body};font-size:var(--font-size-xs,0.75rem);text-transform:uppercase;letter-spacing:0.08em;color:var(--color-interactive,oklch(55% .2 260));font-weight:600">${t.eyebrow}</small>
23
+ <h1 style="font-family:${e.display};font-size:var(--font-size-3xl,2rem);font-weight:800;margin:0;line-height:1.15">${t.heading}</h1>
24
+ <p style="font-family:${e.body};font-size:var(--font-size-sm,0.875rem);color:var(--color-text-muted,#666);margin:0">${t.byline}</p>
25
+ <p style="font-family:${e.body};font-size:var(--font-size-lg,1.125rem);line-height:1.6;margin:0;color:var(--color-text-muted,#666)">${t.lead}</p>
26
+ <h2 style="font-family:${e.heading};font-size:var(--font-size-xl,1.375rem);font-weight:700;margin:0">${t.subheading}</h2>
27
+ <p style="font-family:${e.body};line-height:1.7;margin:0">${t.body}</p>
28
+ <p style="font-family:${e.body};line-height:1.7;margin:0">${t.body2}</p>
29
+ <blockquote style="font-family:${e.display};font-style:italic;font-size:var(--font-size-lg,1.125rem);border-inline-start:3px solid var(--color-interactive,oklch(55% .2 260));padding-inline-start:var(--size-m,1rem);margin:0;color:var(--color-text-muted,#666)">${t.quote}</blockquote>
30
+ <h2 style="font-family:${e.heading};font-size:var(--font-size-xl,1.375rem);font-weight:700;margin:0">Implementation Details</h2>
31
+ <p style="font-family:${e.body};line-height:1.7;margin:0">Design tokens form the atomic layer of any visual system. Colors, spacing, typography, and motion are expressed as named variables that cascade through every component. When a token changes, every surface that references it updates automatically \u2014 no find-and-replace, no missed instances.</p>
32
+ <pre style="font-family:${e.code};font-size:var(--font-size-sm,0.875rem);line-height:1.5;margin:0;padding:var(--size-s,0.75rem);background:var(--color-surface-sunken,#eee);border-radius:var(--radius-s,0.25rem);overflow-x:auto"><code>${t.code}</code></pre>
33
+ <h3 style="font-family:${e.heading};font-size:var(--font-size-lg,1.125rem);font-weight:600;margin:0">Key Takeaways</h3>
34
+ <ul style="font-family:${e.body};line-height:1.7;margin:0;padding-inline-start:1.5rem">
35
35
  <li>Typography sets the emotional tone before a single word is read</li>
36
36
  <li>Pair contrast with harmony \u2014 serif headings with sans-serif body</li>
37
37
  <li>Test at real content lengths, not just sample sentences</li>
38
38
  <li>Code fonts need clear distinction between similar glyphs</li>
39
- </ul>`},card:{label:"Card UI",render:(t,e)=>`
39
+ </ul>`},card:{label:"Card UI",render:(e,t)=>`
40
40
  <div style="display:grid;grid-template-columns:1fr 1fr;gap:var(--size-m,1rem)">
41
41
  <div style="border:1px solid var(--color-border,#ddd);border-radius:var(--radius-m,0.5rem);padding:var(--size-m,1rem);display:flex;flex-direction:column;gap:var(--size-xs,0.5rem)">
42
- <h4 style="font-family:${t.heading};font-weight:600;margin:0" ${n(t.heading,"h4","cardTitle")}>Premium Plan</h4>
43
- <p style="font-family:${t.display};font-size:var(--font-size-2xl,1.75rem);font-weight:700;margin:0">$49<small style="font-size:0.5em;font-weight:400">/mo</small></p>
44
- <p style="font-family:${t.body};font-size:var(--font-size-sm,0.875rem);color:var(--color-text-muted,#666);margin:0" ${n(t.body,"p","cardBody")}>Everything you need to build faster.</p>
45
- <code style="font-family:${t.code};font-size:var(--font-size-xs,0.75rem);background:var(--color-surface-sunken,#eee);padding:0.2rem 0.4rem;border-radius:0.25rem" ${n(t.code,"code","cardCode")}>npm install acme</code>
42
+ <h4 style="font-family:${e.heading};font-weight:600;margin:0" ${r(e.heading,"h4","cardTitle")}>Premium Plan</h4>
43
+ <p style="font-family:${e.display};font-size:var(--font-size-2xl,1.75rem);font-weight:700;margin:0">$49<small style="font-size:0.5em;font-weight:400">/mo</small></p>
44
+ <p style="font-family:${e.body};font-size:var(--font-size-sm,0.875rem);color:var(--color-text-muted,#666);margin:0" ${r(e.body,"p","cardBody")}>Everything you need to build faster.</p>
45
+ <code style="font-family:${e.code};font-size:var(--font-size-xs,0.75rem);background:var(--color-surface-sunken,#eee);padding:0.2rem 0.4rem;border-radius:0.25rem" ${r(e.code,"code","cardCode")}>npm install acme</code>
46
46
  </div>
47
47
  <div style="border:1px solid var(--color-border,#ddd);border-radius:var(--radius-m,0.5rem);padding:var(--size-m,1rem);display:flex;flex-direction:column;gap:var(--size-xs,0.5rem)">
48
- <h4 style="font-family:${t.heading};font-weight:600;margin:0">Enterprise</h4>
49
- <p style="font-family:${t.display};font-size:var(--font-size-2xl,1.75rem);font-weight:700;margin:0">Custom</p>
50
- <p style="font-family:${t.body};font-size:var(--font-size-sm,0.875rem);color:var(--color-text-muted,#666);margin:0">Dedicated support and SLA guarantees.</p>
51
- <code style="font-family:${t.code};font-size:var(--font-size-xs,0.75rem);background:var(--color-surface-sunken,#eee);padding:0.2rem 0.4rem;border-radius:0.25rem">contact@acme.dev</code>
48
+ <h4 style="font-family:${e.heading};font-weight:600;margin:0">Enterprise</h4>
49
+ <p style="font-family:${e.display};font-size:var(--font-size-2xl,1.75rem);font-weight:700;margin:0">Custom</p>
50
+ <p style="font-family:${e.body};font-size:var(--font-size-sm,0.875rem);color:var(--color-text-muted,#666);margin:0">Dedicated support and SLA guarantees.</p>
51
+ <code style="font-family:${e.code};font-size:var(--font-size-xs,0.75rem);background:var(--color-surface-sunken,#eee);padding:0.2rem 0.4rem;border-radius:0.25rem">contact@acme.dev</code>
52
52
  </div>
53
- </div>`},hero:{label:"Hero",render:(t,e)=>`
53
+ </div>`},hero:{label:"Hero",render:(e,t)=>`
54
54
  <div style="text-align:center;padding:var(--size-xl,2rem) 0">
55
- <p style="font-family:${t.body};font-size:var(--font-size-xs,0.75rem);text-transform:uppercase;letter-spacing:0.1em;color:var(--color-interactive,oklch(55% .2 260));font-weight:600;margin:0 0 var(--size-xs,0.5rem)"
56
- ${n(t.body,"p","eyebrow")}>${e.eyebrow}</p>
57
- <h1 style="font-family:${t.display};font-size:clamp(2rem,5vw,3rem);font-weight:800;margin:0;line-height:1.1"
58
- ${n(t.display,"h1","heading")}>${e.heading}</h1>
59
- <p style="font-family:${t.body};font-size:var(--font-size-lg,1.125rem);color:var(--color-text-muted,#666);margin:var(--size-s,0.75rem) auto 0;max-width:40ch"
60
- ${n(t.body,"p","body")}>${e.body}</p>
61
- </div>`}},b=class extends p{static observedAttributes=["heading-font","body-font","code-font","display-font","sample","show-export","show-suggestions","preview"];#e={heading:"",body:"",code:"",display:""};#t="combined";#i={heading:"The Art of Typography",subheading:"Building visual harmony through font pairing",body:"Good typography is invisible \u2014 it lets the content speak without distraction. The best font pairings create harmony between heading impact and body readability. Every typeface carries personality: serif fonts convey trust and tradition, while sans-serif fonts feel modern and clean.",body2:"Choosing the right pairing is about contrast and complement. A bold display font for headlines needs a quiet, readable body font to balance it. Monospace fonts ground technical content in precision. The interplay between these roles defines your brand voice.",code:`const theme = {
55
+ <p style="font-family:${e.body};font-size:var(--font-size-xs,0.75rem);text-transform:uppercase;letter-spacing:0.1em;color:var(--color-interactive,oklch(55% .2 260));font-weight:600;margin:0 0 var(--size-xs,0.5rem)"
56
+ ${r(e.body,"p","eyebrow")}>${t.eyebrow}</p>
57
+ <h1 style="font-family:${e.display};font-size:clamp(2rem,5vw,3rem);font-weight:800;margin:0;line-height:1.1"
58
+ ${r(e.display,"h1","heading")}>${t.heading}</h1>
59
+ <p style="font-family:${e.body};font-size:var(--font-size-lg,1.125rem);color:var(--color-text-muted,#666);margin:var(--size-s,0.75rem) auto 0;max-width:40ch"
60
+ ${r(e.body,"p","body")}>${t.body}</p>
61
+ </div>`}},x=class extends y{static observedAttributes=["heading-font","body-font","code-font","display-font","sample","show-export","show-suggestions","preview"];#e={heading:"",body:"",code:"",display:""};#t="combined";#i={heading:"The Art of Typography",subheading:"Building visual harmony through font pairing",body:"Good typography is invisible \u2014 it lets the content speak without distraction. The best font pairings create harmony between heading impact and body readability. Every typeface carries personality: serif fonts convey trust and tradition, while sans-serif fonts feel modern and clean.",body2:"Choosing the right pairing is about contrast and complement. A bold display font for headlines needs a quiet, readable body font to balance it. Monospace fonts ground technical content in precision. The interplay between these roles defines your brand voice.",code:`const theme = {
62
62
  heading: "Playfair Display",
63
63
  body: "Inter",
64
64
  tokens: { size: 16, scale: 1.25 }
65
- };`,eyebrow:"Design Systems",byline:"By Jamie Chen \xB7 April 14, 2026 \xB7 8 min read",lead:"How native CSS features and design tokens are replacing the complex tooling we thought we needed.",quote:'"Good typography is invisible \u2014 it lets the content breathe."'};setup(){this.#e.heading=this.getAttribute("heading-font")||"Playfair Display",this.#e.body=this.getAttribute("body-font")||"Inter",this.#e.code=this.getAttribute("code-font")||"JetBrains Mono",this.#e.display=this.getAttribute("display-font")||this.#e.heading,this.#t=this.getAttribute("preview")||"combined",this.#s(),this.#o()}attributeChangedCallback(e,i,o){i===o||!this.isConnected||(e==="heading-font"&&(this.#e.heading=o||"Playfair Display"),e==="body-font"&&(this.#e.body=o||"Inter"),e==="code-font"&&(this.#e.code=o||"JetBrains Mono"),e==="display-font"&&(this.#e.display=o||this.#e.heading),e==="preview"&&(this.#t=o||"combined"),this.#s(),this.#o())}async#o(){let e=Object.values(this.#e).filter(Boolean).map(i=>{let o=f.find(r=>r.name===i);return k(i,o?.weights||"400;700")});await Promise.all(e),this.#f()}#s(){let e=this.hasAttribute("show-export"),i=this.hasAttribute("show-suggestions"),o="var(--size-m, 1rem)",r="var(--size-s, 0.75rem)",s="var(--size-xs, 0.5rem)",a="var(--radius-m, 0.5rem)",c="var(--color-border, #ddd)",h="var(--color-surface, #fff)",$="var(--color-surface-raised, #f5f5f5)",m="var(--color-text-muted, #666)",S="var(--font-size-sm, 0.875rem)",l="var(--font-size-xs, 0.75rem)",E=`font:inherit;font-size:${S};padding:0.35rem 0.5rem;border:1px solid ${c};border-radius:4px;background:${h}`,C=[{key:"heading",label:"Heading"},{key:"body",label:"Body"},{key:"code",label:"Code"},{key:"display",label:"Display"}].map(d=>`
66
- <label style="display:flex;flex-direction:column;gap:3px;flex:1;min-width:9rem;font-size:${l};font-weight:600;color:${m};text-transform:uppercase;letter-spacing:0.04em">
65
+ };`,eyebrow:"Design Systems",byline:"By Jamie Chen \xB7 April 14, 2026 \xB7 8 min read",lead:"How native CSS features and design tokens are replacing the complex tooling we thought we needed.",quote:'"Good typography is invisible \u2014 it lets the content breathe."'};setup(){this.#e.heading=this.getAttribute("heading-font")||"Playfair Display",this.#e.body=this.getAttribute("body-font")||"Inter",this.#e.code=this.getAttribute("code-font")||"JetBrains Mono",this.#e.display=this.getAttribute("display-font")||this.#e.heading,this.#t=this.getAttribute("preview")||"combined",this.#n(),this.#o()}attributeChangedCallback(t,o,i){o===i||!this.isConnected||(t==="heading-font"&&(this.#e.heading=i||"Playfair Display"),t==="body-font"&&(this.#e.body=i||"Inter"),t==="code-font"&&(this.#e.code=i||"JetBrains Mono"),t==="display-font"&&(this.#e.display=i||this.#e.heading),t==="preview"&&(this.#t=i||"combined"),this.#n(),this.#o())}async#o(){let t=Object.values(this.#e).filter(Boolean).map(o=>{let i=m.find(s=>s.name===o);return M(o,i?.weights||"400;700")});await Promise.all(t),this.#p()}#n(){let t=this.hasAttribute("show-export"),o=this.hasAttribute("show-suggestions"),i="var(--size-m, 1rem)",s="var(--size-s, 0.75rem)",n="var(--size-xs, 0.5rem)",a="var(--radius-m, 0.5rem)",c="var(--color-border, #ddd)",u="var(--color-surface, #fff)",z="var(--color-surface-raised, #f5f5f5)",f="var(--color-text-muted, #666)",N="var(--font-size-sm, 0.875rem)",l="var(--font-size-xs, 0.75rem)",D=`font:inherit;font-size:${N};padding:0.35rem 0.5rem;border:1px solid ${c};border-radius:4px;background:${u}`,L=[{key:"heading",label:"Heading"},{key:"body",label:"Body"},{key:"code",label:"Code"},{key:"display",label:"Display"}].map(d=>`
66
+ <label style="display:flex;flex-direction:column;gap:3px;flex:1;min-width:9rem;font-size:${l};font-weight:600;color:${f};text-transform:uppercase;letter-spacing:0.04em">
67
67
  ${d.label}
68
- <select class="fp-select" data-role="${d.key}" style="${E}">
69
- ${this.#c(this.#e[d.key])}
68
+ <select class="fp-select" data-role="${d.key}" style="${D}">
69
+ ${this.#d(this.#e[d.key])}
70
70
  </select>
71
71
  </label>
72
- `).join(""),M=Object.entries(u).map(([d,{label:y}])=>`<button type="button" class="fp-tab" data-mode="${d}"
73
- style="all:unset;cursor:pointer;font-size:${l};padding:0.3rem 0.75rem;border-radius:999px;${d===this.#t?"background:var(--color-interactive,oklch(55% .2 260));color:white":`border:1px solid ${c}`}">${y}</button>`).join(""),A={heading:`'${this.#e.heading}', serif`,body:`'${this.#e.body}', sans-serif`,code:`'${this.#e.code}', monospace`,display:`'${this.#e.display}', serif`},T=u[this.#t]?.render(A,this.#i)||"",L=z.map(([d,y])=>`<button type="button" class="fp-suggestion" data-h="${d}" data-b="${y}"
72
+ `).join(""),O=Object.entries(w).map(([d,{label:p}])=>`<button type="button" class="fp-tab" data-mode="${d}"
73
+ style="all:unset;cursor:pointer;font-size:${l};padding:0.3rem 0.75rem;border-radius:999px;${d===this.#t?"background:var(--color-interactive,oklch(55% .2 260));color:white":`border:1px solid ${c}`}">${p}</button>`).join(""),I={heading:`'${this.#e.heading}', serif`,body:`'${this.#e.body}', sans-serif`,code:`'${this.#e.code}', monospace`,display:`'${this.#e.display}', serif`},q=w[this.#t]?.render(I,this.#i)||"",P=A.map(([d,p])=>`<button type="button" class="fp-suggestion" data-h="${d}" data-b="${p}"
74
74
  style="all:unset;cursor:pointer;font-size:${l};padding:0.3rem 0.5rem;border:1px solid ${c};border-radius:4px;white-space:nowrap;text-align:left;line-height:1.3"
75
- title="${d} + ${y}"><strong>${d}</strong><br><span style="color:${m}">${y}</span></button>`).join(""),q=this.#r(),P=`<details class="fp-code-details" style="border:1px solid ${c};border-radius:${a};overflow:hidden"${e?" open":""}>
76
- <summary style="padding:${s} ${r};cursor:pointer;font-size:${l};font-weight:600;color:${m};text-transform:uppercase;letter-spacing:0.04em;background:${$}">Code</summary>
77
- <div style="padding:${r}">
78
- <pre style="font-family:var(--font-mono,monospace);font-size:${l};margin:0;white-space:pre-wrap;word-break:break-all" class="fp-css-output">${q}</pre>
79
- <div style="display:flex;gap:${s};margin-block-start:${r}">
75
+ title="${d} + ${p}"><strong>${d}</strong><br><span style="color:${f}">${p}</span></button>`).join(""),B=this.#s(),F=`<details class="fp-code-details" style="border:1px solid ${c};border-radius:${a};overflow:hidden"${t?" open":""}>
76
+ <summary style="padding:${n} ${s};cursor:pointer;font-size:${l};font-weight:600;color:${f};text-transform:uppercase;letter-spacing:0.04em;background:${z}">Code</summary>
77
+ <div style="padding:${s}">
78
+ <pre style="font-family:var(--font-mono,monospace);font-size:${l};margin:0;white-space:pre-wrap;word-break:break-all" class="fp-css-output">${B}</pre>
79
+ <div style="display:flex;gap:${n};margin-block-start:${s}">
80
80
  <button type="button" class="fp-copy-css"
81
- style="all:unset;cursor:pointer;font-size:${l};padding:0.3rem 0.65rem;border:1px solid ${c};border-radius:4px;background:${h}">Copy CSS</button>
81
+ style="all:unset;cursor:pointer;font-size:${l};padding:0.3rem 0.65rem;border:1px solid ${c};border-radius:4px;background:${u}">Copy CSS</button>
82
82
  <button type="button" class="fp-copy-import"
83
- style="all:unset;cursor:pointer;font-size:${l};padding:0.3rem 0.65rem;border:1px solid ${c};border-radius:4px;background:${h}">Copy @import</button>
83
+ style="all:unset;cursor:pointer;font-size:${l};padding:0.3rem 0.65rem;border:1px solid ${c};border-radius:4px;background:${u}">Copy @import</button>
84
84
  </div>
85
85
  </div>
86
- </details>`,v=`<div style="display:flex;flex-direction:column;gap:${o};flex:1;min-width:0">
87
- <div style="display:flex;flex-wrap:wrap;gap:${s}">${C}</div>
86
+ </details>`,E=`<div style="display:flex;flex-direction:column;gap:${i};flex:1;min-width:0">
87
+ <div style="display:flex;flex-wrap:wrap;gap:${n}">${L}</div>
88
88
  <div style="display:flex;flex-wrap:wrap;gap:0.375rem;align-items:center">
89
- <span style="font-size:${l};font-weight:600;color:${m};text-transform:uppercase;letter-spacing:0.04em;margin-inline-end:${s}">Examples</span>
90
- ${M}
89
+ <span style="font-size:${l};font-weight:600;color:${f};text-transform:uppercase;letter-spacing:0.04em;margin-inline-end:${n}">Examples</span>
90
+ ${O}
91
91
  </div>
92
- <div style="display:flex;flex-direction:column;gap:${s}">
93
- <span style="font-size:${l};font-weight:600;color:${m};text-transform:uppercase;letter-spacing:0.04em">Preview</span>
94
- <div class="fp-preview" style="padding:var(--size-l,1.5rem);background:${$};border-radius:${a};border:1px solid ${c};display:flex;flex-direction:column;gap:${r};max-height:24rem;overflow-y:auto">
95
- ${T}
92
+ <div style="display:flex;flex-direction:column;gap:${n}">
93
+ <span style="font-size:${l};font-weight:600;color:${f};text-transform:uppercase;letter-spacing:0.04em">Preview</span>
94
+ <div class="fp-preview" style="padding:var(--size-l,1.5rem);background:${z};border-radius:${a};border:1px solid ${c};display:flex;flex-direction:column;gap:${s};max-height:24rem;overflow-y:auto">
95
+ ${q}
96
96
  </div>
97
97
  </div>
98
- ${P}
99
- </div>`;i?this.innerHTML=`<div style="display:flex;gap:${o};flex-wrap:wrap">
100
- ${v}
101
- <aside style="flex:0 0 11rem;display:flex;flex-direction:column;gap:${s}">
102
- <span style="font-size:${l};font-weight:600;color:${m};text-transform:uppercase;letter-spacing:0.04em">Pairings</span>
103
- <div style="display:flex;flex-direction:column;gap:0.25rem">${L}</div>
98
+ ${F}
99
+ </div>`;o?this.innerHTML=`<div style="display:flex;gap:${i};flex-wrap:wrap">
100
+ ${E}
101
+ <aside style="flex:0 0 11rem;display:flex;flex-direction:column;gap:${n}">
102
+ <span style="font-size:${l};font-weight:600;color:${f};text-transform:uppercase;letter-spacing:0.04em">Pairings</span>
103
+ <div style="display:flex;flex-direction:column;gap:0.25rem">${P}</div>
104
104
  </aside>
105
- </div>`:this.innerHTML=v,this.#y()}#c(e){return["serif","sans-serif","display","monospace"].map(o=>{let s=f.filter(a=>a.category===o).map(a=>`<option value="${a.name}"${a.name===e?" selected":""}>${a.name}</option>`).join("");return`<optgroup label="${o}">${s}</optgroup>`}).join("")}#r(){let e=[],i={heading:"serif",body:"sans-serif",code:"monospace",display:"serif"};for(let[o,r]of Object.entries(i)){let s=this.#e[o];if(!s)continue;let a=f.find(c=>c.name===s);e.push(`--font-${o}: "${s}", ${a?.category||r};`)}return e.join(`
106
- `)}#m(){let e=new Set,i=[];for(let o of Object.values(this.#e)){if(!o||e.has(o))continue;e.add(o);let r=f.find(s=>s.name===o);i.push(`@import url('${g(o,r?.weights||"400;700")}');`)}return i.join(`
107
- `)}#y(){this.querySelectorAll(".fp-select").forEach(e=>{e.addEventListener("change",i=>{this.#e[i.target.dataset.role]=i.target.value,this.#o(),this.#n(),this.#a(),this.#d()})}),this.querySelectorAll(".fp-tab").forEach(e=>{e.addEventListener("click",()=>{this.#t=e.dataset.mode,this.#s(),this.#o()})}),this.querySelectorAll(".fp-suggestion").forEach(e=>{e.addEventListener("click",()=>{this.#e.heading=e.dataset.h,this.#e.body=e.dataset.b,this.#e.display=e.dataset.h,this.#s(),this.#o(),this.#d()})}),this.querySelectorAll(".fp-editable").forEach(e=>{e.addEventListener("blur",()=>{let i=e.dataset.role;i&&e.textContent.trim()&&(this.#i[i]=e.textContent.trim())})}),this.querySelector(".fp-copy-css")?.addEventListener("click",e=>{navigator.clipboard?.writeText(this.#r()),this.#l(e.target)}),this.querySelector(".fp-copy-import")?.addEventListener("click",e=>{navigator.clipboard?.writeText(this.#m()),this.#l(e.target)})}#n(){let e=this.querySelector(".fp-preview");if(!e)return;let i={heading:`'${this.#e.heading}', serif`,body:`'${this.#e.body}', sans-serif`,code:`'${this.#e.code}', monospace`,display:`'${this.#e.display}', serif`};e.innerHTML=u[this.#t]?.render(i,this.#i)||"",e.querySelectorAll(".fp-editable").forEach(o=>{o.addEventListener("blur",()=>{let r=o.dataset.role;r&&o.textContent.trim()&&(this.#i[r]=o.textContent.trim())})})}#f(){this.#n(),this.#a()}#a(){let e=this.querySelector(".fp-css-output");e&&(e.textContent=this.#r())}#l(e){let i=e.textContent;e.textContent="Copied!",setTimeout(()=>{e.textContent=i},1500)}#d(){this.dispatchEvent(new CustomEvent("font-pairer:change",{bubbles:!0,detail:{...this.#e}}))}};x("font-pairer",b);export{b as FontPairer};
105
+ </div>`:this.innerHTML=E,this.#f()}#d(t){return["serif","sans-serif","display","monospace"].map(i=>{let n=m.filter(a=>a.category===i).map(a=>`<option value="${a.name}"${a.name===t?" selected":""}>${a.name}</option>`).join("");return`<optgroup label="${i}">${n}</optgroup>`}).join("")}#s(){let t=[],o={heading:"serif",body:"sans-serif",code:"monospace",display:"serif"};for(let[i,s]of Object.entries(o)){let n=this.#e[i];if(!n)continue;let a=m.find(c=>c.name===n);t.push(`--font-${i}: "${n}", ${a?.category||s};`)}return t.join(`
106
+ `)}#c(){let t=new Set,o=[];for(let i of Object.values(this.#e)){if(!i||t.has(i))continue;t.add(i);let s=m.find(n=>n.name===i);o.push(`@import url('${$(i,s?.weights||"400;700")}');`)}return o.join(`
107
+ `)}#f(){this.querySelectorAll(".fp-select").forEach(t=>{t.addEventListener("change",o=>{let i=o.target;this.#e[i.dataset.role]=i.value,this.#o(),this.#r(),this.#a(),this.#l()})}),this.querySelectorAll(".fp-tab").forEach(t=>{t.addEventListener("click",()=>{let o=t;this.#t=o.dataset.mode||"combined",this.#n(),this.#o()})}),this.querySelectorAll(".fp-suggestion").forEach(t=>{t.addEventListener("click",()=>{let o=t;this.#e.heading=o.dataset.h||"",this.#e.body=o.dataset.b||"",this.#e.display=o.dataset.h||"",this.#n(),this.#o(),this.#l()})}),this.querySelectorAll(".fp-editable").forEach(t=>{let o=t;o.addEventListener("blur",()=>{let i=o.dataset.role;i&&o.textContent.trim()&&(this.#i[i]=o.textContent.trim())})}),this.querySelector(".fp-copy-css")?.addEventListener("click",t=>{h(this.#s(),{button:t.target,announceMessage:"CSS copied"})}),this.querySelector(".fp-copy-import")?.addEventListener("click",t=>{h(this.#c(),{button:t.target,announceMessage:"@import statement copied"})})}#r(){let t=this.querySelector(".fp-preview");if(!t)return;let o={heading:`'${this.#e.heading}', serif`,body:`'${this.#e.body}', sans-serif`,code:`'${this.#e.code}', monospace`,display:`'${this.#e.display}', serif`};t.innerHTML=w[this.#t]?.render(o,this.#i)||"",t.querySelectorAll(".fp-editable").forEach(i=>{let s=i;s.addEventListener("blur",()=>{let n=s.dataset.role;n&&s.textContent.trim()&&(this.#i[n]=s.textContent.trim())})})}#p(){this.#r(),this.#a()}#a(){let t=this.querySelector(".fp-css-output");t&&(t.textContent=this.#s())}#l(){this.dispatchEvent(new CustomEvent("font-pairer:change",{bubbles:!0,detail:{...this.#e}}))}};k("font-pairer",x);export{x as FontPairer};
108
108
  //# sourceMappingURL=font-pairer.js.map