@lifecorner/angular-ui-kit 3.7.0 → 3.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/README.md +1 -0
  2. package/fesm2022/lifecorner-angular-ui-kit-app-shell.mjs +4 -4
  3. package/fesm2022/lifecorner-angular-ui-kit-app-shell.mjs.map +1 -1
  4. package/fesm2022/lifecorner-angular-ui-kit-button.mjs +39 -6
  5. package/fesm2022/lifecorner-angular-ui-kit-button.mjs.map +1 -1
  6. package/fesm2022/lifecorner-angular-ui-kit-character-svg.mjs +91 -0
  7. package/fesm2022/lifecorner-angular-ui-kit-character-svg.mjs.map +1 -0
  8. package/fesm2022/lifecorner-angular-ui-kit-character.mjs +138 -0
  9. package/fesm2022/lifecorner-angular-ui-kit-character.mjs.map +1 -0
  10. package/fesm2022/lifecorner-angular-ui-kit-choice-prompt.mjs +2 -1
  11. package/fesm2022/lifecorner-angular-ui-kit-choice-prompt.mjs.map +1 -1
  12. package/fesm2022/lifecorner-angular-ui-kit-confirm-dialog.mjs +2 -1
  13. package/fesm2022/lifecorner-angular-ui-kit-confirm-dialog.mjs.map +1 -1
  14. package/fesm2022/lifecorner-angular-ui-kit-copy-field.mjs +2 -1
  15. package/fesm2022/lifecorner-angular-ui-kit-copy-field.mjs.map +1 -1
  16. package/fesm2022/lifecorner-angular-ui-kit-header.mjs +2 -1
  17. package/fesm2022/lifecorner-angular-ui-kit-header.mjs.map +1 -1
  18. package/fesm2022/lifecorner-angular-ui-kit-list.mjs +2 -1
  19. package/fesm2022/lifecorner-angular-ui-kit-list.mjs.map +1 -1
  20. package/fesm2022/lifecorner-angular-ui-kit-next-step-card.mjs +2 -1
  21. package/fesm2022/lifecorner-angular-ui-kit-next-step-card.mjs.map +1 -1
  22. package/fesm2022/lifecorner-angular-ui-kit-page-header.mjs +2 -2
  23. package/fesm2022/lifecorner-angular-ui-kit-page-header.mjs.map +1 -1
  24. package/fesm2022/lifecorner-angular-ui-kit-skeleton.mjs +2 -2
  25. package/fesm2022/lifecorner-angular-ui-kit-skeleton.mjs.map +1 -1
  26. package/fesm2022/lifecorner-angular-ui-kit-table.mjs +2 -1
  27. package/fesm2022/lifecorner-angular-ui-kit-table.mjs.map +1 -1
  28. package/fesm2022/lifecorner-angular-ui-kit.mjs +2 -0
  29. package/package.json +12 -1
  30. package/src/assets/README.md +4 -0
  31. package/src/assets/character/all-done-dark.svg +1 -0
  32. package/src/assets/character/all-done-light.svg +1 -0
  33. package/src/assets/character/calm-dark.svg +1 -0
  34. package/src/assets/character/calm-light.svg +1 -0
  35. package/src/assets/character/comforts-dark.svg +1 -0
  36. package/src/assets/character/comforts-light.svg +1 -0
  37. package/src/assets/character/connection-paused-dark.svg +1 -0
  38. package/src/assets/character/connection-paused-light.svg +1 -0
  39. package/src/assets/character/connects-dark.svg +1 -0
  40. package/src/assets/character/connects-light.svg +1 -0
  41. package/src/assets/character/discovered-dark.svg +1 -0
  42. package/src/assets/character/discovered-light.svg +1 -0
  43. package/src/assets/character/happy-dark.svg +1 -0
  44. package/src/assets/character/happy-light.svg +1 -0
  45. package/src/assets/character/hello-dark.svg +1 -0
  46. package/src/assets/character/hello-light.svg +1 -0
  47. package/src/assets/character/in-his-corner-dark.svg +1 -0
  48. package/src/assets/character/in-his-corner-light.svg +1 -0
  49. package/src/assets/character/resting-dark.svg +1 -0
  50. package/src/assets/character/resting-light.svg +1 -0
  51. package/src/assets/character/see-you-dark.svg +1 -0
  52. package/src/assets/character/see-you-light.svg +1 -0
  53. package/src/assets/character/shows-the-way-dark.svg +1 -0
  54. package/src/assets/character/shows-the-way-light.svg +1 -0
  55. package/src/assets/character/thinking-dark.svg +1 -0
  56. package/src/assets/character/thinking-light.svg +1 -0
  57. package/src/assets/character/welcomes-member-dark.svg +1 -0
  58. package/src/assets/character/welcomes-member-light.svg +1 -0
  59. package/src/styles/_horizon.scss +95 -9
  60. package/src/styles/horizon.figure.spec.ts +79 -0
  61. package/src/styles/horizon.shell.spec.ts +67 -0
  62. package/src/styles/horizon.spec.ts +6 -4
  63. package/types/lifecorner-angular-ui-kit-app-shell.d.ts +15 -4
  64. package/types/lifecorner-angular-ui-kit-button.d.ts +30 -0
  65. package/types/lifecorner-angular-ui-kit-character-svg.d.ts +44 -0
  66. package/types/lifecorner-angular-ui-kit-character.d.ts +104 -0
  67. package/types/lifecorner-angular-ui-kit-page-header.d.ts +6 -1
  68. package/types/lifecorner-angular-ui-kit-skeleton.d.ts +7 -1
  69. package/types/lifecorner-angular-ui-kit.d.ts +2 -0
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><path d="M6 6 L6 92 L98 92" fill="none" stroke="#cfe0e4" stroke-width="2" stroke-linecap="round"></path><g transform="translate(3 6)"><g fill="none" stroke="#1a6a79" stroke-width="5.5" stroke-linecap="round"><path d="M34 50 C27 58 21 70 14 80"></path><path d="M44 56 C42 66 38 74 33 80"></path><path d="M56 56 C59 66 63 74 68 80"></path><path d="M66 50 C74 58 82 72 90 80"></path></g><ellipse cx="50" cy="38" rx="22" ry="20" fill="#1a6a79"></ellipse><ellipse cx="43" cy="29" rx="8" ry="4.5" fill="#ffffff" opacity="0.14"></ellipse><circle cx="37" cy="46" r="3.2" fill="#84c7d4" opacity="0.55"></circle><circle cx="63" cy="46" r="3.2" fill="#84c7d4" opacity="0.55"></circle><circle cx="42" cy="38" r="4.6" fill="#ffffff"></circle><circle cx="58" cy="38" r="4.6" fill="#ffffff"></circle><circle cx="43.6" cy="38.8" r="2.3" fill="#0c1722"></circle><circle cx="59.6" cy="38.8" r="2.3" fill="#0c1722"></circle><path d="M45 45.5 Q50 49 55 45.5" fill="none" stroke="#0c1722" stroke-width="2" stroke-linecap="round"></path><g fill="#ffffff" stroke="#1a6a79" stroke-width="4"><circle cx="14" cy="80" r="5.5"></circle><circle cx="33" cy="80" r="5.5"></circle><circle cx="68" cy="80" r="5.5"></circle><circle cx="90" cy="80" r="5.5"></circle></g></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><g fill="none" stroke="#84c7d4" stroke-width="5.5" stroke-linecap="round"><path d="M34 50 C27 58 24 66 22 74"></path><path d="M44 56 C42 65 40 72 38 79"></path><path d="M56 56 C58 65 60 72 62 79"></path><path d="M66 50 C73 58 76 66 78 74"></path></g><g transform="rotate(-5 50 45)"><ellipse cx="50" cy="38" rx="22" ry="20" fill="#84c7d4"></ellipse><ellipse cx="43" cy="29" rx="8" ry="4.5" fill="#ffffff" opacity="0.22"></ellipse><circle cx="37" cy="46" r="3.2" fill="#1a6a79" opacity="0.55"></circle><circle cx="63" cy="46" r="3.2" fill="#1a6a79" opacity="0.55"></circle><path d="M37.5 37.5 Q42 41.5 46.5 37.5" fill="none" stroke="#0c1722" stroke-width="2.4" stroke-linecap="round"></path><path d="M53.5 37.5 Q58 41.5 62.5 37.5" fill="none" stroke="#0c1722" stroke-width="2.4" stroke-linecap="round"></path><path d="M46 46 Q50 48.6 54 46" fill="none" stroke="#0c1722" stroke-width="2" stroke-linecap="round"></path></g><g fill="#84c7d4" stroke="#84c7d4" stroke-width="4"><circle cx="22" cy="76" r="5.5"></circle><circle cx="38" cy="81" r="5.5"></circle><circle cx="62" cy="81" r="5.5"></circle><circle cx="78" cy="76" r="5.5"></circle></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><g fill="none" stroke="#1a6a79" stroke-width="5.5" stroke-linecap="round"><path d="M34 50 C27 58 24 66 22 74"></path><path d="M44 56 C42 65 40 72 38 79"></path><path d="M56 56 C58 65 60 72 62 79"></path><path d="M66 50 C73 58 76 66 78 74"></path></g><g transform="rotate(-5 50 45)"><ellipse cx="50" cy="38" rx="22" ry="20" fill="#1a6a79"></ellipse><ellipse cx="43" cy="29" rx="8" ry="4.5" fill="#ffffff" opacity="0.14"></ellipse><circle cx="37" cy="46" r="3.2" fill="#84c7d4" opacity="0.55"></circle><circle cx="63" cy="46" r="3.2" fill="#84c7d4" opacity="0.55"></circle><path d="M37.5 37.5 Q42 41.5 46.5 37.5" fill="none" stroke="#0c1722" stroke-width="2.4" stroke-linecap="round"></path><path d="M53.5 37.5 Q58 41.5 62.5 37.5" fill="none" stroke="#0c1722" stroke-width="2.4" stroke-linecap="round"></path><path d="M46 46 Q50 48.6 54 46" fill="none" stroke="#0c1722" stroke-width="2" stroke-linecap="round"></path></g><g fill="#84c7d4" stroke="#1a6a79" stroke-width="4"><circle cx="22" cy="76" r="5.5"></circle><circle cx="38" cy="81" r="5.5"></circle><circle cx="62" cy="81" r="5.5"></circle><circle cx="78" cy="76" r="5.5"></circle></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><g fill="none" stroke="#4f9aaa" stroke-width="1.8" stroke-linecap="round"><path d="M7 13 Q4.5 19 7 25"></path><path d="M30 12 Q32.5 18 30 24"></path></g><g fill="none" stroke="#84c7d4" stroke-width="5.5" stroke-linecap="round"><path d="M34 46 C26 40 21 31 19 22"></path><path d="M44 56 C42 65 39 73 36 79"></path><path d="M56 56 C58 65 61 73 64 79"></path><path d="M66 50 C73 57 78 64 83 68"></path></g><ellipse cx="50" cy="38" rx="22" ry="20" fill="#84c7d4"></ellipse><ellipse cx="43" cy="29" rx="8" ry="4.5" fill="#ffffff" opacity="0.22"></ellipse><circle cx="37" cy="46" r="3.2" fill="#1a6a79" opacity="0.55"></circle><circle cx="63" cy="46" r="3.2" fill="#1a6a79" opacity="0.55"></circle><path d="M37.5 38 Q42 33.5 46.5 38" fill="none" stroke="#0c1722" stroke-width="2.4" stroke-linecap="round"></path><path d="M53.5 38 Q58 33.5 62.5 38" fill="none" stroke="#0c1722" stroke-width="2.4" stroke-linecap="round"></path><path d="M45 45.5 Q50 50 55 45.5" fill="none" stroke="#0c1722" stroke-width="2.2" stroke-linecap="round"></path><g fill="#0a121b" stroke="#84c7d4" stroke-width="4"><circle cx="18" cy="19" r="5.5"></circle><circle cx="35" cy="82" r="5.5"></circle><circle cx="65" cy="82" r="5.5"></circle><circle cx="85" cy="70" r="5.5"></circle></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><g fill="none" stroke="#84c7d4" stroke-width="1.8" stroke-linecap="round"><path d="M7 13 Q4.5 19 7 25"></path><path d="M30 12 Q32.5 18 30 24"></path></g><g fill="none" stroke="#1a6a79" stroke-width="5.5" stroke-linecap="round"><path d="M34 46 C26 40 21 31 19 22"></path><path d="M44 56 C42 65 39 73 36 79"></path><path d="M56 56 C58 65 61 73 64 79"></path><path d="M66 50 C73 57 78 64 83 68"></path></g><ellipse cx="50" cy="38" rx="22" ry="20" fill="#1a6a79"></ellipse><ellipse cx="43" cy="29" rx="8" ry="4.5" fill="#ffffff" opacity="0.14"></ellipse><circle cx="37" cy="46" r="3.2" fill="#84c7d4" opacity="0.55"></circle><circle cx="63" cy="46" r="3.2" fill="#84c7d4" opacity="0.55"></circle><path d="M37.5 38 Q42 33.5 46.5 38" fill="none" stroke="#0c1722" stroke-width="2.4" stroke-linecap="round"></path><path d="M53.5 38 Q58 33.5 62.5 38" fill="none" stroke="#0c1722" stroke-width="2.4" stroke-linecap="round"></path><path d="M45 45.5 Q50 50 55 45.5" fill="none" stroke="#0c1722" stroke-width="2.2" stroke-linecap="round"></path><g fill="#ffffff" stroke="#1a6a79" stroke-width="4"><circle cx="18" cy="19" r="5.5"></circle><circle cx="35" cy="82" r="5.5"></circle><circle cx="65" cy="82" r="5.5"></circle><circle cx="85" cy="70" r="5.5"></circle></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><path d="M78 30 Q86 27 94 29" fill="none" stroke="#4f9aaa" stroke-width="1.6" stroke-dasharray="3 3" stroke-linecap="round"></path><g fill="none" stroke="#84c7d4" stroke-width="5.5" stroke-linecap="round"><path d="M34 50 C27 57 22 64 17 68"></path><path d="M44 56 C42 65 39 73 36 79"></path><path d="M56 56 C58 65 61 73 64 79"></path><path d="M67 45 C76 43 84 41 91 39"></path></g><ellipse cx="50" cy="38" rx="22" ry="20" fill="#84c7d4"></ellipse><ellipse cx="43" cy="29" rx="8" ry="4.5" fill="#ffffff" opacity="0.22"></ellipse><circle cx="37" cy="46" r="3.2" fill="#1a6a79" opacity="0.55"></circle><circle cx="63" cy="46" r="3.2" fill="#1a6a79" opacity="0.55"></circle><circle cx="42" cy="38" r="4.6" fill="#ffffff"></circle><circle cx="58" cy="38" r="4.6" fill="#ffffff"></circle><circle cx="44.2" cy="38.6" r="2.3" fill="#0c1722"></circle><circle cx="60.2" cy="38.6" r="2.3" fill="#0c1722"></circle><path d="M45 45 Q50.5 49.5 56 45" fill="none" stroke="#0c1722" stroke-width="2.2" stroke-linecap="round"></path><g fill="#0a121b" stroke="#84c7d4" stroke-width="4"><circle cx="15" cy="70" r="5.5"></circle><circle cx="35" cy="82" r="5.5"></circle><circle cx="65" cy="82" r="5.5"></circle></g><g fill="#84c7d4" stroke="#84c7d4" stroke-width="4"><circle cx="92" cy="39" r="5.5"></circle></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><path d="M78 30 Q86 27 94 29" fill="none" stroke="#84c7d4" stroke-width="1.6" stroke-dasharray="3 3" stroke-linecap="round"></path><g fill="none" stroke="#1a6a79" stroke-width="5.5" stroke-linecap="round"><path d="M34 50 C27 57 22 64 17 68"></path><path d="M44 56 C42 65 39 73 36 79"></path><path d="M56 56 C58 65 61 73 64 79"></path><path d="M67 45 C76 43 84 41 91 39"></path></g><ellipse cx="50" cy="38" rx="22" ry="20" fill="#1a6a79"></ellipse><ellipse cx="43" cy="29" rx="8" ry="4.5" fill="#ffffff" opacity="0.14"></ellipse><circle cx="37" cy="46" r="3.2" fill="#84c7d4" opacity="0.55"></circle><circle cx="63" cy="46" r="3.2" fill="#84c7d4" opacity="0.55"></circle><circle cx="42" cy="38" r="4.6" fill="#ffffff"></circle><circle cx="58" cy="38" r="4.6" fill="#ffffff"></circle><circle cx="44.2" cy="38.6" r="2.3" fill="#0c1722"></circle><circle cx="60.2" cy="38.6" r="2.3" fill="#0c1722"></circle><path d="M45 45 Q50.5 49.5 56 45" fill="none" stroke="#0c1722" stroke-width="2.2" stroke-linecap="round"></path><g fill="#ffffff" stroke="#1a6a79" stroke-width="4"><circle cx="15" cy="70" r="5.5"></circle><circle cx="35" cy="82" r="5.5"></circle><circle cx="65" cy="82" r="5.5"></circle></g><g fill="#84c7d4" stroke="#1a6a79" stroke-width="4"><circle cx="92" cy="39" r="5.5"></circle></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><g fill="#4f9aaa"><circle cx="74" cy="20" r="2"></circle><circle cx="80.5" cy="15" r="2.4"></circle><circle cx="87.5" cy="10.5" r="2.8"></circle></g><g fill="none" stroke="#84c7d4" stroke-width="5.5" stroke-linecap="round"><path d="M44 56 C42 65 39 73 36 79"></path><path d="M56 56 C58 65 61 73 64 79"></path><path d="M66 50 C73 57 78 64 83 68"></path></g><ellipse cx="50" cy="38" rx="22" ry="20" fill="#84c7d4"></ellipse><ellipse cx="43" cy="29" rx="8" ry="4.5" fill="#ffffff" opacity="0.22"></ellipse><circle cx="63" cy="46" r="3.2" fill="#1a6a79" opacity="0.55"></circle><circle cx="42" cy="38" r="4.6" fill="#ffffff"></circle><circle cx="58" cy="38" r="4.6" fill="#ffffff"></circle><circle cx="40.8" cy="36.6" r="2.3" fill="#0c1722"></circle><circle cx="56.8" cy="36.6" r="2.3" fill="#0c1722"></circle><path d="M46 47 Q50.5 48.5 54 46" fill="none" stroke="#0c1722" stroke-width="2" stroke-linecap="round"></path><path d="M33 50 C29 57 32 63 38 60" fill="none" stroke="#84c7d4" stroke-width="5.5" stroke-linecap="round"></path><g fill="#0a121b" stroke="#84c7d4" stroke-width="4"><circle cx="40" cy="58" r="4.6"></circle><circle cx="35" cy="82" r="5.5"></circle><circle cx="65" cy="82" r="5.5"></circle><circle cx="85" cy="70" r="5.5"></circle></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><g fill="#84c7d4"><circle cx="74" cy="20" r="2"></circle><circle cx="80.5" cy="15" r="2.4"></circle><circle cx="87.5" cy="10.5" r="2.8"></circle></g><g fill="none" stroke="#1a6a79" stroke-width="5.5" stroke-linecap="round"><path d="M44 56 C42 65 39 73 36 79"></path><path d="M56 56 C58 65 61 73 64 79"></path><path d="M66 50 C73 57 78 64 83 68"></path></g><ellipse cx="50" cy="38" rx="22" ry="20" fill="#1a6a79"></ellipse><ellipse cx="43" cy="29" rx="8" ry="4.5" fill="#ffffff" opacity="0.14"></ellipse><circle cx="63" cy="46" r="3.2" fill="#84c7d4" opacity="0.55"></circle><circle cx="42" cy="38" r="4.6" fill="#ffffff"></circle><circle cx="58" cy="38" r="4.6" fill="#ffffff"></circle><circle cx="40.8" cy="36.6" r="2.3" fill="#0c1722"></circle><circle cx="56.8" cy="36.6" r="2.3" fill="#0c1722"></circle><path d="M46 47 Q50.5 48.5 54 46" fill="none" stroke="#0c1722" stroke-width="2" stroke-linecap="round"></path><path d="M33 50 C29 57 32 63 38 60" fill="none" stroke="#1a6a79" stroke-width="5.5" stroke-linecap="round"></path><g fill="#ffffff" stroke="#1a6a79" stroke-width="4"><circle cx="40" cy="58" r="4.6"></circle><circle cx="35" cy="82" r="5.5"></circle><circle cx="65" cy="82" r="5.5"></circle><circle cx="85" cy="70" r="5.5"></circle></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><path d="M50 15.5 C44 11.5 41 8.5 41 6 C41 3.4 43 2.2 45.2 2.2 C47.2 2.2 49 3.4 50 5.2 C51 3.4 52.8 2.2 54.8 2.2 C57 2.2 59 3.4 59 6 C59 8.5 56 11.5 50 15.5 Z" fill="#e8b04a"></path><g fill="none" stroke="#84c7d4" stroke-width="5.5" stroke-linecap="round"><path d="M34 46 C26 44 18 40 11 35"></path><path d="M44 56 C42 65 39 73 36 79"></path><path d="M56 56 C58 65 61 73 64 79"></path><path d="M66 46 C74 44 82 40 89 35"></path></g><ellipse cx="50" cy="38" rx="22" ry="20" fill="#84c7d4"></ellipse><ellipse cx="43" cy="29" rx="8" ry="4.5" fill="#ffffff" opacity="0.22"></ellipse><circle cx="37" cy="46" r="3.2" fill="#1a6a79" opacity="0.55"></circle><circle cx="63" cy="46" r="3.2" fill="#1a6a79" opacity="0.55"></circle><circle cx="42" cy="38" r="4.6" fill="#ffffff"></circle><circle cx="58" cy="38" r="4.6" fill="#ffffff"></circle><circle cx="42.0" cy="38.6" r="2.3" fill="#0c1722"></circle><circle cx="58.0" cy="38.6" r="2.3" fill="#0c1722"></circle><path d="M44 45 Q50 51.5 56 45" fill="none" stroke="#0c1722" stroke-width="2.2" stroke-linecap="round"></path><g fill="#0a121b" stroke="#84c7d4" stroke-width="4"><circle cx="10" cy="34" r="5.5"></circle><circle cx="35" cy="82" r="5.5"></circle><circle cx="65" cy="82" r="5.5"></circle><circle cx="90" cy="34" r="5.5"></circle></g></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><path d="M50 15.5 C44 11.5 41 8.5 41 6 C41 3.4 43 2.2 45.2 2.2 C47.2 2.2 49 3.4 50 5.2 C51 3.4 52.8 2.2 54.8 2.2 C57 2.2 59 3.4 59 6 C59 8.5 56 11.5 50 15.5 Z" fill="#e8b04a"></path><g fill="none" stroke="#1a6a79" stroke-width="5.5" stroke-linecap="round"><path d="M34 46 C26 44 18 40 11 35"></path><path d="M44 56 C42 65 39 73 36 79"></path><path d="M56 56 C58 65 61 73 64 79"></path><path d="M66 46 C74 44 82 40 89 35"></path></g><ellipse cx="50" cy="38" rx="22" ry="20" fill="#1a6a79"></ellipse><ellipse cx="43" cy="29" rx="8" ry="4.5" fill="#ffffff" opacity="0.14"></ellipse><circle cx="37" cy="46" r="3.2" fill="#84c7d4" opacity="0.55"></circle><circle cx="63" cy="46" r="3.2" fill="#84c7d4" opacity="0.55"></circle><circle cx="42" cy="38" r="4.6" fill="#ffffff"></circle><circle cx="58" cy="38" r="4.6" fill="#ffffff"></circle><circle cx="42.0" cy="38.6" r="2.3" fill="#0c1722"></circle><circle cx="58.0" cy="38.6" r="2.3" fill="#0c1722"></circle><path d="M44 45 Q50 51.5 56 45" fill="none" stroke="#0c1722" stroke-width="2.2" stroke-linecap="round"></path><g fill="#ffffff" stroke="#1a6a79" stroke-width="4"><circle cx="10" cy="34" r="5.5"></circle><circle cx="35" cy="82" r="5.5"></circle><circle cx="65" cy="82" r="5.5"></circle><circle cx="90" cy="34" r="5.5"></circle></g></svg>
@@ -26,11 +26,29 @@
26
26
  *
27
27
  * Inputs (custom properties, set on the block or any ancestor):
28
28
  * --lc-horizon-land height of the land below the line
29
- * (default Today's: 112 px phone, 100 · 120 · 140 · 184 px
30
- * from 1024 · 1280 · 1440 · 1920; with the compact footer
31
- * on the land add its height, e.g. 136 px on the phone)
29
+ * (default Today's: 112 px phone, 72 · 80 · 96 · 128 px
30
+ * from 1024 · 1280 · 1440 · 1920 (3.9, LK-12); with the
31
+ * compact footer on the land add its height, e.g. 136 px
32
+ * on the phone. Inside lc-app-shell with a [shell-footer]
33
+ * the footer's height is added below it by the shell.)
32
34
  * --lc-horizon-sun-radius the sun's radius (58 px phone, 70 · 90 · 120 · 166 px)
33
35
  * --lc-horizon-sun-x the sun's centre from the block's left edge (72%)
36
+ * --lc-horizon-figure-size the figure's size in .lc-horizon__figure
37
+ * (64 px phone, 96 px from 1024, 128 px from 1920)
38
+ * --lc-horizon-figure-gap its right edge to the sun's left edge (16 px; 24 px from 1024)
39
+ *
40
+ * Figure (3.8, G-4): Edu on the line, left of the sun, in a DIRECT child with
41
+ * .lc-horizon__figure (lc-character, <img>, <picture>, or an element holding an
42
+ * inline <svg>), placed BEFORE .lc-horizon__land. His feet stand on the line
43
+ * (the box bottom 12.5 % of its size below it); the block's height above the
44
+ * line becomes max(sun + 22 px, figure + 8 px). Decorative, never a target:
45
+ *
46
+ * <div class="lc-horizon" aria-hidden="true">
47
+ * <lc-character class="lc-horizon__figure" pose="comforts" />
48
+ * </div>
49
+ *
50
+ * In lc-app-shell (3.9, AS-29) the attribute `shell-horizon-figure` alone does
51
+ * the same: the shell projects the element as a direct child of its horizon.
34
52
  *
35
53
  * Colours: --color-background-low, --color-horizon-line, --color-land-1…3,
36
54
  * --color-sun-1…3, --color-sun-ring, --color-sun-halo (theme tokens).
@@ -40,6 +58,8 @@
40
58
  --_lc-horizon-land: var(--lc-horizon-land, 112px);
41
59
  --_lc-horizon-r: var(--lc-horizon-sun-radius, 58px);
42
60
  --_lc-horizon-x: var(--lc-horizon-sun-x, 72%);
61
+ --_lc-horizon-fig: var(--lc-horizon-figure-size, 64px);
62
+ --_lc-horizon-fig-gap: var(--lc-horizon-figure-gap, 16px);
43
63
 
44
64
  position: relative;
45
65
  flex: 1 0 auto;
@@ -79,26 +99,30 @@
79
99
  linear-gradient(180deg, transparent, var(--color-background-low))
80
100
  0 0 / 100% calc(100% - var(--_lc-horizon-land)) no-repeat;
81
101
 
82
- // Desktop steps of Today's horizon (app-shell 12.2). A page sets its own
83
- // geometry through --lc-horizon-land / --lc-horizon-sun-radius.
102
+ // Desktop steps of Today's horizon (app-shell 12.2; the land 72 · 80 · 96 ·
103
+ // 128 px since 3.9, LK-12). A page sets its own geometry through
104
+ // --lc-horizon-land / --lc-horizon-sun-radius.
84
105
  @media (min-width: 1024px) {
85
- --_lc-horizon-land: var(--lc-horizon-land, 100px);
106
+ --_lc-horizon-land: var(--lc-horizon-land, 72px);
86
107
  --_lc-horizon-r: var(--lc-horizon-sun-radius, 70px);
108
+ --_lc-horizon-fig: var(--lc-horizon-figure-size, 96px);
109
+ --_lc-horizon-fig-gap: var(--lc-horizon-figure-gap, 24px);
87
110
  }
88
111
 
89
112
  @media (min-width: 1280px) {
90
- --_lc-horizon-land: var(--lc-horizon-land, 120px);
113
+ --_lc-horizon-land: var(--lc-horizon-land, 80px);
91
114
  --_lc-horizon-r: var(--lc-horizon-sun-radius, 90px);
92
115
  }
93
116
 
94
117
  @media (min-width: 1440px) {
95
- --_lc-horizon-land: var(--lc-horizon-land, 140px);
118
+ --_lc-horizon-land: var(--lc-horizon-land, 96px);
96
119
  --_lc-horizon-r: var(--lc-horizon-sun-radius, 120px);
97
120
  }
98
121
 
99
122
  @media (min-width: 1920px) {
100
- --_lc-horizon-land: var(--lc-horizon-land, 184px);
123
+ --_lc-horizon-land: var(--lc-horizon-land, 128px);
101
124
  --_lc-horizon-r: var(--lc-horizon-sun-radius, 166px);
125
+ --_lc-horizon-fig: var(--lc-horizon-figure-size, 128px);
102
126
  }
103
127
 
104
128
  // Windows high contrast and other forced-colour modes: no decoration.
@@ -113,3 +137,65 @@
113
137
  position: absolute;
114
138
  inset: auto 0 0;
115
139
  }
140
+
141
+ // Edu on the horizon line (3.8, G-4): left of the sun, the feet on the line.
142
+ // Only a block WITH the figure gets the taller minimum; without it the block
143
+ // renders exactly as before.
144
+ @mixin figure-min-height {
145
+ min-height: calc(var(--_lc-horizon-land) + max(var(--_lc-horizon-r) + 22px, var(--_lc-horizon-fig) + 8px));
146
+ }
147
+
148
+ // The slot sizes the figure (an lc-character's `size` input doesn't apply).
149
+ // Its right edge sits the gap left of the sun's left edge; the box bottom lies
150
+ // 12.5 % of its size below the line, where the standing poses' feet end
151
+ // (y 87.5 of 100). Px, not rem: at 200 % text the figure keeps its size.
152
+ @mixin figure {
153
+ --lc-character-size: var(--_lc-horizon-fig);
154
+
155
+ position: absolute;
156
+ right: calc(100% - var(--_lc-horizon-x) + var(--_lc-horizon-r) + var(--_lc-horizon-fig-gap));
157
+ bottom: calc(var(--_lc-horizon-land) - var(--_lc-horizon-fig) * 0.125);
158
+ width: var(--_lc-horizon-fig);
159
+ height: var(--_lc-horizon-fig);
160
+ pointer-events: none;
161
+
162
+ // Decoration, like the horizon's own: dropped, its box kept.
163
+ @media (forced-colors: active) {
164
+ visibility: hidden;
165
+ }
166
+ }
167
+
168
+ // A <picture> or an element holding an inline <svg>.
169
+ @mixin figure-fill {
170
+ display: block;
171
+ width: 100%;
172
+ height: 100%;
173
+ }
174
+
175
+ .lc-horizon:has(> .lc-horizon__figure) {
176
+ @include figure-min-height;
177
+ }
178
+
179
+ .lc-horizon__figure {
180
+ @include figure;
181
+ }
182
+
183
+ .lc-horizon__figure > :is(img, svg) {
184
+ @include figure-fill;
185
+ }
186
+
187
+ // lc-app-shell's figure slot (3.9, AS-29): the attribute alone places the
188
+ // figure, with the same rules and the same specificity as .lc-horizon__figure
189
+ // (`:where` adds none). Here, not in the shell's own stylesheet: the slot's
190
+ // element belongs to the page's view, and `:has()` must see it.
191
+ .lc-horizon:has(> [shell-horizon-figure]) {
192
+ @include figure-min-height;
193
+ }
194
+
195
+ .lc-horizon > :where([shell-horizon-figure]) {
196
+ @include figure;
197
+ }
198
+
199
+ .lc-horizon > :where([shell-horizon-figure]) > :is(img, svg) {
200
+ @include figure-fill;
201
+ }
@@ -0,0 +1,79 @@
1
+ import { compile } from 'sass';
2
+ import { resolve } from 'path';
3
+
4
+ /**
5
+ * The horizon's figure slot (3.8, G-4, AC-15 and AC-16 of request 005), read
6
+ * from the compiled CSS. The block without a figure is pinned by
7
+ * horizon.spec.ts, which this request leaves unchanged.
8
+ */
9
+ const css = '\n' + compile(resolve(__dirname, '_horizon.scss')).css;
10
+
11
+ /** The declarations of the top-level rule whose selector is exactly `selector` (compiled rules start a line). */
12
+ function rule(selector: string): string {
13
+ const start = css.indexOf(`\n${selector} {`);
14
+ expect(start).toBeGreaterThan(-1);
15
+ return css.slice(start, css.indexOf('}', start));
16
+ }
17
+
18
+ describe('.lc-horizon__figure (G-4)', () => {
19
+ it('takes the figure size and gap from custom properties: 64 px and 16 px on the phone', () => {
20
+ const base = rule('.lc-horizon');
21
+ expect(base).toMatch(/--_lc-horizon-fig:\s*var\(--lc-horizon-figure-size, 64px\)/);
22
+ expect(base).toMatch(/--_lc-horizon-fig-gap:\s*var\(--lc-horizon-figure-gap, 16px\)/);
23
+ });
24
+
25
+ it.each([
26
+ [1024, '96px', '24px'],
27
+ [1920, '128px', null],
28
+ ])('steps up from %s px: size %s, gap %s', (width, size, gap) => {
29
+ const start = css.indexOf(`@media (min-width: ${width}px) {\n .lc-horizon {`);
30
+ expect(start).toBeGreaterThan(-1);
31
+ const step = css.slice(start, css.indexOf('}', start));
32
+ expect(step).toContain(`--_lc-horizon-fig: var(--lc-horizon-figure-size, ${size})`);
33
+ if (gap) expect(step).toContain(`--_lc-horizon-fig-gap: var(--lc-horizon-figure-gap, ${gap})`);
34
+ else expect(step).not.toContain('--_lc-horizon-fig-gap');
35
+ });
36
+
37
+ it.each([1280, 1440])('keeps 96 px and 24 px at %s px (no figure step there)', (width) => {
38
+ const start = css.indexOf(`@media (min-width: ${width}px) {\n .lc-horizon {`);
39
+ expect(css.slice(start, css.indexOf('}', start))).not.toContain('--_lc-horizon-fig');
40
+ });
41
+
42
+ it('raises the minimum above the line to max(sun + 22 px, figure + 8 px) only with a figure child', () => {
43
+ expect(rule('.lc-horizon:has(> .lc-horizon__figure)')).toMatch(
44
+ /min-height:\s*calc\(var\(--_lc-horizon-land\) \+ max\(var\(--_lc-horizon-r\) \+ 22px, var\(--_lc-horizon-fig\) \+ 8px\)\)/,
45
+ );
46
+ // The block without the figure keeps land + sun + 22 px (horizon.spec.ts).
47
+ expect(rule('.lc-horizon')).toMatch(/min-height:\s*calc\(var\(--_lc-horizon-land\) \+ var\(--_lc-horizon-r\) \+ 22px\)/);
48
+ });
49
+
50
+ it('places the figure left of the sun with the gap, its feet on the line, sized by the slot', () => {
51
+ const figure = rule('.lc-horizon__figure');
52
+ expect(figure).toMatch(/position:\s*absolute/);
53
+ expect(figure).toMatch(/right:\s*calc\(100% - var\(--_lc-horizon-x\) \+ var\(--_lc-horizon-r\) \+ var\(--_lc-horizon-fig-gap\)\)/);
54
+ expect(figure).toMatch(/bottom:\s*calc\(var\(--_lc-horizon-land\) - var\(--_lc-horizon-fig\) \* 0\.125\)/);
55
+ expect(figure).toMatch(/width:\s*var\(--_lc-horizon-fig\)/);
56
+ expect(figure).toMatch(/height:\s*var\(--_lc-horizon-fig\)/);
57
+ expect(figure).toMatch(/--lc-character-size:\s*var\(--_lc-horizon-fig\)/);
58
+ });
59
+
60
+ it('AC-16: the figure is never a pointer target', () => {
61
+ expect(rule('.lc-horizon__figure')).toMatch(/pointer-events:\s*none/);
62
+ });
63
+
64
+ it('drops the figure in forced colours, keeping its box', () => {
65
+ expect(css).toMatch(/@media \(forced-colors: active\) \{\s*\.lc-horizon__figure \{\s*visibility: hidden;/);
66
+ });
67
+
68
+ it('fills the slot with a <picture>’s image or an inline <svg>', () => {
69
+ const child = rule('.lc-horizon__figure > :is(img, svg)');
70
+ expect(child).toMatch(/display:\s*block/);
71
+ expect(child).toMatch(/width:\s*100%/);
72
+ expect(child).toMatch(/height:\s*100%/);
73
+ });
74
+
75
+ it('adds no motion and no raw colour', () => {
76
+ const figureCss = css.slice(css.indexOf('.lc-horizon:has('));
77
+ expect(figureCss).not.toMatch(/animation|transition|#[0-9a-f]{3,6}\b/i);
78
+ });
79
+ });
@@ -0,0 +1,67 @@
1
+ import { compile } from 'sass';
2
+ import { resolve } from 'path';
3
+
4
+ /**
5
+ * The horizon in 3.9 (request 006): the slimmer land defaults (LK-12, AC-1,
6
+ * AC-3, AC-8) and lc-app-shell's figure slot `[shell-horizon-figure]` (AS-29,
7
+ * AC-6, AC-7), read from the compiled CSS. The 3.8 figure rules are pinned by
8
+ * horizon.figure.spec.ts.
9
+ */
10
+ const css = '\n' + compile(resolve(__dirname, '_horizon.scss')).css;
11
+
12
+ /** The declarations of the top-level rule whose selector is exactly `selector` (compiled rules start a line). */
13
+ function rule(selector: string): string {
14
+ const start = css.indexOf(`\n${selector} {`);
15
+ expect(start).toBeGreaterThan(-1);
16
+ return css.slice(start + selector.length + 3, css.indexOf('}', start)).trim();
17
+ }
18
+
19
+ /** The declarations of `selector` inside `@media (forced-colors: active)`. */
20
+ function forcedColors(selector: string): string {
21
+ const match = new RegExp(`@media \\(forced-colors: active\\) \\{\\s*${selector.replace(/[.*+?^${}()|[\]\\>]/g, '\\$&')} \\{([^}]*)\\}`).exec(css);
22
+ expect(match).not.toBeNull();
23
+ return (match?.[1] ?? '').trim();
24
+ }
25
+
26
+ describe('.lc-horizon land defaults (LK-12)', () => {
27
+ it('AC-1: 112 px on the phone, 72 · 80 · 96 · 128 px from 1024 · 1280 · 1440 · 1920', () => {
28
+ const lands = [...css.matchAll(/--_lc-horizon-land: var\(--lc-horizon-land, (\d+)px\)/g)].map((m) => Number(m[1]));
29
+ expect(lands).toEqual([112, 72, 80, 96, 128]);
30
+ });
31
+
32
+ it('AC-3, AC-8: --lc-horizon-land wins at every width (every step is only its fallback)', () => {
33
+ const steps = [...css.matchAll(/--_lc-horizon-land:\s*([^;]+);/g)].map((m) => m[1]);
34
+ expect(steps).toHaveLength(5);
35
+ for (const step of steps) expect(step).toMatch(/^var\(--lc-horizon-land, \d+px\)$/);
36
+ });
37
+ });
38
+
39
+ describe('[shell-horizon-figure] (AS-29)', () => {
40
+ it('places the shell figure with exactly the rules of .lc-horizon__figure', () => {
41
+ expect(rule('.lc-horizon > :where([shell-horizon-figure])')).toBe(rule('.lc-horizon__figure'));
42
+ expect(rule('.lc-horizon > :where([shell-horizon-figure]) > :is(img, svg)')).toBe(rule('.lc-horizon__figure > :is(img, svg)'));
43
+ });
44
+
45
+ it('raises the minimum above the line with a figure child, as .lc-horizon__figure does', () => {
46
+ expect(rule('.lc-horizon:has(> [shell-horizon-figure])')).toBe(rule('.lc-horizon:has(> .lc-horizon__figure)'));
47
+ });
48
+
49
+ it('AC-7: sizes and places the figure, never a pointer target, hidden in forced colours', () => {
50
+ const figure = rule('.lc-horizon > :where([shell-horizon-figure])');
51
+ expect(figure).toMatch(/position:\s*absolute/);
52
+ expect(figure).toMatch(/--lc-character-size:\s*var\(--_lc-horizon-fig\)/);
53
+ expect(figure).toMatch(/pointer-events:\s*none/);
54
+ expect(forcedColors('.lc-horizon > :where([shell-horizon-figure])')).toBe(forcedColors('.lc-horizon__figure'));
55
+ });
56
+
57
+ it('keeps the specificity of .lc-horizon__figure: :where() adds none to the attribute', () => {
58
+ // (0,1,0) like `.lc-horizon__figure`, (0,2,0) for the :has() rule: every
59
+ // selector that names the attribute, in order (the third is in forced colours).
60
+ expect(css.match(/^[^{}\n]*shell-horizon-figure[^{}\n]*(?= \{)/gm)).toEqual([
61
+ '.lc-horizon:has(> [shell-horizon-figure])',
62
+ '.lc-horizon > :where([shell-horizon-figure])',
63
+ ' .lc-horizon > :where([shell-horizon-figure])',
64
+ '.lc-horizon > :where([shell-horizon-figure]) > :is(img, svg)',
65
+ ]);
66
+ });
67
+ });
@@ -49,11 +49,13 @@ describe('.lc-horizon (LK-1)', () => {
49
49
  expect(base).toMatch(/--_lc-horizon-x:\s*var\(--lc-horizon-sun-x, 72%\)/);
50
50
  });
51
51
 
52
+ // The land steps changed in 3.9 (LK-12, request 006): 100 · 120 · 140 · 184 px
53
+ // became 72 · 80 · 96 · 128 px; the sun radii are unchanged.
52
54
  it.each([
53
- [1024, '100px', '70px'],
54
- [1280, '120px', '90px'],
55
- [1440, '140px', '120px'],
56
- [1920, '184px', '166px'],
55
+ [1024, '72px', '70px'],
56
+ [1280, '80px', '90px'],
57
+ [1440, '96px', '120px'],
58
+ [1920, '128px', '166px'],
57
59
  ])('uses Today’s desktop geometry from %s px', (width, land, radius) => {
58
60
  const step = block(`@media (min-width: ${width}px) {\n .lc-horizon {`);
59
61
  expect(step).toContain(`var(--lc-horizon-land, ${land})`);
@@ -20,8 +20,17 @@ import * as i0 from "@angular/core";
20
20
  * reserves its height at the end of the page (16 + 72 + 24 px plus the
21
21
  * safe-area inset; `--lc-app-shell-bottom-clearance`), so it never covers
22
22
  * content. With the horizon, the bar rests on the land instead.
23
- * - `[shell-footer]` — e.g. a compact `lc-footer`; on the horizon's land when
24
- * `horizon` is on, else after the page.
23
+ * - `[shell-footer]` — e.g. a compact `lc-footer`; after the page, or with
24
+ * `horizon` in a row of its own below the horizon, painted in the land's
25
+ * colour (`--color-land-3`): the land grows by the footer's height, so
26
+ * `--lc-horizon-land` stays the land above the footer and no page overrides
27
+ * it (3.9, LK-12).
28
+ * - `[shell-horizon-figure]` — Edu (or any decorative figure) on the horizon
29
+ * line, left of the sun: `lc-character`, `<img>`, `<picture>` or an element
30
+ * holding an inline `<svg>`. Projected as a direct child of `.lc-horizon`,
31
+ * sized and placed by the horizon (`--lc-horizon-figure-size` / `-gap`).
32
+ * Decorative: the horizon is `aria-hidden`, so give an `<img>` `alt=""` and
33
+ * nothing focusable. Shown only when `horizon` is on (3.9, AS-29).
25
34
  *
26
35
  * `horizon` closes the page with the "Weite" horizon (`.lc-horizon` from the
27
36
  * kit's styles): full-bleed, below the side navigation and the page, filling
@@ -47,7 +56,9 @@ export declare class AppShellComponent {
47
56
  /**
48
57
  * Close the page with the horizon (`.lc-horizon`): full width, below the
49
58
  * side navigation and the page, filling the rest of the screen; the footer
50
- * and the floating bar rest on its land.
59
+ * (in a row of its own, which adds to the land) and the floating bar rest
60
+ * on its land, and `[shell-horizon-figure]` stands on its line.
61
+ * @default false
51
62
  */
52
63
  readonly horizon: import("@angular/core").InputSignal<boolean>;
53
64
  protected readonly shellClasses: import("@angular/core").Signal<string>;
@@ -58,7 +69,7 @@ export declare class AppShellComponent {
58
69
  "required": false;
59
70
  "isSignal": true;
60
71
  };
61
- }, {}, never, ["[shell-header]", "[shell-nav]", "*", "[shell-footer]", "[shell-bottom-nav]"], true, never>;
72
+ }, {}, never, ["[shell-header]", "[shell-nav]", "*", "[shell-horizon-figure]", "[shell-footer]", "[shell-bottom-nav]"], true, never>;
62
73
  }
63
74
  /**
64
75
  * A page inside `lc-app-shell`: the `<main>` landmark with the page's content
@@ -30,6 +30,16 @@ export declare class ButtonComponent {
30
30
  * @default false
31
31
  */
32
32
  readonly inline: import("@angular/core").InputSignal<boolean>;
33
+ /**
34
+ * Drop the inline padding so a `variant="link"` button sits flush with the
35
+ * content edge: the label starts at the edge, and the button keeps its height
36
+ * and a 44 × 44 px minimum target. At the end edge of a row, set the CSS
37
+ * hook `--lc-btn-flush-align: end` (default `start`) on the host or an
38
+ * ancestor: every line of the label then ends at the edge. Ignored on other
39
+ * variants and with `iconOnly` (3.9, AS-26).
40
+ * @default false
41
+ */
42
+ readonly flush: import("@angular/core").InputSignal<boolean>;
33
43
  readonly clicked: import("@angular/core").OutputEmitterRef<void>;
34
44
  readonly focused: import("@angular/core").OutputEmitterRef<void>;
35
45
  readonly blurred: import("@angular/core").OutputEmitterRef<void>;
@@ -102,6 +112,11 @@ export declare class ButtonComponent {
102
112
  "required": false;
103
113
  "isSignal": true;
104
114
  };
115
+ "flush": {
116
+ "alias": "flush";
117
+ "required": false;
118
+ "isSignal": true;
119
+ };
105
120
  }, {
106
121
  "clicked": "clicked";
107
122
  "focused": "focused";
@@ -148,6 +163,16 @@ export declare class ButtonLinkComponent {
148
163
  * size, weight and line-height). Pair with `variant="link"`.
149
164
  */
150
165
  readonly inline: import("@angular/core").InputSignal<boolean>;
166
+ /**
167
+ * Drop the inline padding so a `variant="link"` link sits flush with the
168
+ * content edge: the label starts at the edge, and the link keeps its height
169
+ * and a 44 × 44 px minimum target. At the end edge of a row, set the CSS
170
+ * hook `--lc-btn-flush-align: end` (default `start`) on the link or an
171
+ * ancestor: every line of the label then ends at the edge. Ignored on other
172
+ * variants and with `iconOnly` (3.9, AS-26).
173
+ * @default false
174
+ */
175
+ readonly flush: import("@angular/core").InputSignal<boolean>;
151
176
  /** Classes on the anchor; merged with the consumer's own `class`. */
152
177
  protected readonly hostClasses: import("@angular/core").Signal<string>;
153
178
  static ɵfac: i0.ɵɵFactoryDeclaration<ButtonLinkComponent, never>;
@@ -177,5 +202,10 @@ export declare class ButtonLinkComponent {
177
202
  "required": false;
178
203
  "isSignal": true;
179
204
  };
205
+ "flush": {
206
+ "alias": "flush";
207
+ "required": false;
208
+ "isSignal": true;
209
+ };
180
210
  }, {}, never, ["[slot='icon-before']", "*", "[slot='icon-after']"], true, never>;
181
211
  }
@@ -0,0 +1,44 @@
1
+ /** One of a pose's two drawings: `light` for light surfaces, `dark` for dark ones. */
2
+ export type CharacterDrawing = 'light' | 'dark';
3
+ /** A pose's two drawings as SVG markup, each equal to its file `<pose>-<drawing>.svg`. */
4
+ export interface CharacterSvgPair {
5
+ readonly light: string;
6
+ readonly dark: string;
7
+ }
8
+ /**
9
+ * Edu's poses (3.8, gap G-4), in the order of the docs. `calm` is the neutral
10
+ * Edu; the post-only poses (peeks-around-corner, amazed, looks-ahead) are not shipped.
11
+ */
12
+ export type CharacterPose = 'hello' | 'shows-the-way' | 'happy' | 'welcomes-member' | 'resting' | 'in-his-corner' | 'comforts' | 'all-done' | 'calm' | 'connects' | 'discovered' | 'thinking' | 'connection-paused' | 'see-you';
13
+ /** Every shipped pose, in the order of the docs. */
14
+ export declare const CHARACTER_POSES: readonly CharacterPose[];
15
+ /** hello (Hallo); dark drawn. */
16
+ export declare const CHARACTER_SVG_HELLO: CharacterSvgPair;
17
+ /** shows-the-way (Zeigt den Weg); dark drawn. */
18
+ export declare const CHARACTER_SVG_SHOWS_THE_WAY: CharacterSvgPair;
19
+ /** happy (Freut sich); dark drawn. */
20
+ export declare const CHARACTER_SVG_HAPPY: CharacterSvgPair;
21
+ /** welcomes-member (Begrüßt ein Mitglied); dark by the rule. */
22
+ export declare const CHARACTER_SVG_WELCOMES_MEMBER: CharacterSvgPair;
23
+ /** resting (Ruht sich aus); dark by the rule. */
24
+ export declare const CHARACTER_SVG_RESTING: CharacterSvgPair;
25
+ /** in-his-corner (Sitzt in seiner Ecke); dark by the rule. */
26
+ export declare const CHARACTER_SVG_IN_HIS_CORNER: CharacterSvgPair;
27
+ /** comforts (Tröstet); dark by the rule. */
28
+ export declare const CHARACTER_SVG_COMFORTS: CharacterSvgPair;
29
+ /** all-done (Erledigt); dark by the rule. */
30
+ export declare const CHARACTER_SVG_ALL_DONE: CharacterSvgPair;
31
+ /** calm (ruhig); dark drawn. */
32
+ export declare const CHARACTER_SVG_CALM: CharacterSvgPair;
33
+ /** connects (Verbindet); dark by the rule. */
34
+ export declare const CHARACTER_SVG_CONNECTS: CharacterSvgPair;
35
+ /** discovered (Hat etwas entdeckt); dark by the rule. */
36
+ export declare const CHARACTER_SVG_DISCOVERED: CharacterSvgPair;
37
+ /** thinking (Denkt nach); dark by the rule. */
38
+ export declare const CHARACTER_SVG_THINKING: CharacterSvgPair;
39
+ /** connection-paused (Verbindung pausiert); dark by the rule. */
40
+ export declare const CHARACTER_SVG_CONNECTION_PAUSED: CharacterSvgPair;
41
+ /** see-you (Bis bald); dark by the rule. */
42
+ export declare const CHARACTER_SVG_SEE_YOU: CharacterSvgPair;
43
+ /** Every pose's light and dark drawing, keyed by pose. */
44
+ export declare const CHARACTER_SVG: Readonly<Record<CharacterPose, CharacterSvgPair>>;
@@ -0,0 +1,104 @@
1
+ import * as i0 from "@angular/core";
2
+ import { InjectionToken } from "@angular/core";
3
+ import { CharacterPose, CharacterPose as CharacterPose$1 } from "@lifecorner/angular-ui-kit/character-svg";
4
+ /** Edge of the figure's square box in px. `--lc-character-size` overrides it. */
5
+ export type CharacterSize = 48 | 64 | 80 | 96 | 128;
6
+ /**
7
+ * Which drawing to show.
8
+ * - `auto`: the root theme picks the light or the dark drawing.
9
+ * - `dark`: the on-dark drawing in both themes, for a fixed dark surface.
10
+ */
11
+ export type CharacterColorMode = 'auto' | 'dark';
12
+ /**
13
+ * The URL folder that holds the pose files (`<pose>-light.svg`,
14
+ * `<pose>-dark.svg`, copied from the package's `assets/character/`). Follows
15
+ * `LC_LOGO_BASE_PATH` (default `/assets` → `/assets/character`) unless you
16
+ * provide it yourself.
17
+ *
18
+ * @example
19
+ * ```ts
20
+ * providers: [{ provide: LC_CHARACTER_BASE_PATH, useValue: '/static/edu' }]
21
+ * ```
22
+ */
23
+ export declare const LC_CHARACTER_BASE_PATH: InjectionToken<string>;
24
+ /**
25
+ * Edu, the LifeCorner character, in one of his poses (3.8, gap G-4).
26
+ *
27
+ * Renders the pose files as `<img>` (no inline SVG, no Trusted Types policy),
28
+ * in a square box that is sized by CSS before any JavaScript runs, so the
29
+ * figure prerenders and never shifts the layout. Decorative by default
30
+ * (`aria-hidden="true"`); `ariaLabel` makes it an image with that name. The
31
+ * figure is still: nothing animates.
32
+ *
33
+ * Without Angular, use the files (`@lifecorner/angular-ui-kit/assets/character/<pose>-<light|dark>.svg`)
34
+ * or the strings of `@lifecorner/angular-ui-kit/character-svg`.
35
+ *
36
+ * @example Decorative, follows the app theme
37
+ * ```html
38
+ * <lc-character pose="comforts" size="96" />
39
+ * ```
40
+ *
41
+ * @example On a fixed dark surface, with a name
42
+ * ```html
43
+ * <lc-character pose="hello" colorMode="dark" ariaLabel="Edu winkt" />
44
+ * ```
45
+ */
46
+ export declare class CharacterComponent {
47
+ /**
48
+ * Which pose to draw: hello, shows-the-way, happy, welcomes-member, resting,
49
+ * in-his-corner, comforts, all-done, calm, connects, discovered, thinking,
50
+ * connection-paused, see-you. `calm` is the neutral Edu.
51
+ * @default 'calm'
52
+ */
53
+ readonly pose: import("@angular/core").InputSignal<CharacterPose$1>;
54
+ /**
55
+ * Edge of the square box in px: 48, 64, 80, 96 or 128 (`size="96"` works
56
+ * too). `--lc-character-size` overrides it; set that hook per breakpoint in
57
+ * CSS.
58
+ * @default 64
59
+ */
60
+ readonly size: import("@angular/core").InputSignalWithTransform<CharacterSize, CharacterSize | "48" | "64" | "80" | "96" | "128">;
61
+ /**
62
+ * Which drawing to show.
63
+ * - `auto`: both drawings are in the DOM and the root theme shows one
64
+ * (light, dark, and system with the OS setting), without JavaScript.
65
+ * - `dark`: only the on-dark drawing, in both themes, for a fixed dark
66
+ * surface such as the hero band.
67
+ * @default 'auto'
68
+ */
69
+ readonly colorMode: import("@angular/core").InputSignal<CharacterColorMode>;
70
+ /**
71
+ * Empty: decorative (`aria-hidden="true"`). Set: `role="img"` with this
72
+ * name. This is your own translated text; the kit ships none.
73
+ * @default ''
74
+ */
75
+ readonly ariaLabel: import("@angular/core").InputSignal<string>;
76
+ private readonly basePath;
77
+ protected readonly lightSrc: import("@angular/core").Signal<string>;
78
+ protected readonly darkSrc: import("@angular/core").Signal<string>;
79
+ protected readonly hostClass: import("@angular/core").Signal<string>;
80
+ static ɵfac: i0.ɵɵFactoryDeclaration<CharacterComponent, never>;
81
+ static ɵcmp: i0.ɵɵComponentDeclaration<CharacterComponent, "lc-character", never, {
82
+ "pose": {
83
+ "alias": "pose";
84
+ "required": false;
85
+ "isSignal": true;
86
+ };
87
+ "size": {
88
+ "alias": "size";
89
+ "required": false;
90
+ "isSignal": true;
91
+ };
92
+ "colorMode": {
93
+ "alias": "colorMode";
94
+ "required": false;
95
+ "isSignal": true;
96
+ };
97
+ "ariaLabel": {
98
+ "alias": "ariaLabel";
99
+ "required": false;
100
+ "isSignal": true;
101
+ };
102
+ }, {}, never, never, true, never>;
103
+ }
104
+ export type { CharacterPose };