@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.
- package/README.md +1 -0
- package/fesm2022/lifecorner-angular-ui-kit-app-shell.mjs +4 -4
- package/fesm2022/lifecorner-angular-ui-kit-app-shell.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-button.mjs +39 -6
- package/fesm2022/lifecorner-angular-ui-kit-button.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-character-svg.mjs +91 -0
- package/fesm2022/lifecorner-angular-ui-kit-character-svg.mjs.map +1 -0
- package/fesm2022/lifecorner-angular-ui-kit-character.mjs +138 -0
- package/fesm2022/lifecorner-angular-ui-kit-character.mjs.map +1 -0
- package/fesm2022/lifecorner-angular-ui-kit-choice-prompt.mjs +2 -1
- package/fesm2022/lifecorner-angular-ui-kit-choice-prompt.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-confirm-dialog.mjs +2 -1
- package/fesm2022/lifecorner-angular-ui-kit-confirm-dialog.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-copy-field.mjs +2 -1
- package/fesm2022/lifecorner-angular-ui-kit-copy-field.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-header.mjs +2 -1
- package/fesm2022/lifecorner-angular-ui-kit-header.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-list.mjs +2 -1
- package/fesm2022/lifecorner-angular-ui-kit-list.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-next-step-card.mjs +2 -1
- package/fesm2022/lifecorner-angular-ui-kit-next-step-card.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-page-header.mjs +2 -2
- package/fesm2022/lifecorner-angular-ui-kit-page-header.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-skeleton.mjs +2 -2
- package/fesm2022/lifecorner-angular-ui-kit-skeleton.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit-table.mjs +2 -1
- package/fesm2022/lifecorner-angular-ui-kit-table.mjs.map +1 -1
- package/fesm2022/lifecorner-angular-ui-kit.mjs +2 -0
- package/package.json +12 -1
- package/src/assets/README.md +4 -0
- package/src/assets/character/all-done-dark.svg +1 -0
- package/src/assets/character/all-done-light.svg +1 -0
- package/src/assets/character/calm-dark.svg +1 -0
- package/src/assets/character/calm-light.svg +1 -0
- package/src/assets/character/comforts-dark.svg +1 -0
- package/src/assets/character/comforts-light.svg +1 -0
- package/src/assets/character/connection-paused-dark.svg +1 -0
- package/src/assets/character/connection-paused-light.svg +1 -0
- package/src/assets/character/connects-dark.svg +1 -0
- package/src/assets/character/connects-light.svg +1 -0
- package/src/assets/character/discovered-dark.svg +1 -0
- package/src/assets/character/discovered-light.svg +1 -0
- package/src/assets/character/happy-dark.svg +1 -0
- package/src/assets/character/happy-light.svg +1 -0
- package/src/assets/character/hello-dark.svg +1 -0
- package/src/assets/character/hello-light.svg +1 -0
- package/src/assets/character/in-his-corner-dark.svg +1 -0
- package/src/assets/character/in-his-corner-light.svg +1 -0
- package/src/assets/character/resting-dark.svg +1 -0
- package/src/assets/character/resting-light.svg +1 -0
- package/src/assets/character/see-you-dark.svg +1 -0
- package/src/assets/character/see-you-light.svg +1 -0
- package/src/assets/character/shows-the-way-dark.svg +1 -0
- package/src/assets/character/shows-the-way-light.svg +1 -0
- package/src/assets/character/thinking-dark.svg +1 -0
- package/src/assets/character/thinking-light.svg +1 -0
- package/src/assets/character/welcomes-member-dark.svg +1 -0
- package/src/assets/character/welcomes-member-light.svg +1 -0
- package/src/styles/_horizon.scss +95 -9
- package/src/styles/horizon.figure.spec.ts +79 -0
- package/src/styles/horizon.shell.spec.ts +67 -0
- package/src/styles/horizon.spec.ts +6 -4
- package/types/lifecorner-angular-ui-kit-app-shell.d.ts +15 -4
- package/types/lifecorner-angular-ui-kit-button.d.ts +30 -0
- package/types/lifecorner-angular-ui-kit-character-svg.d.ts +44 -0
- package/types/lifecorner-angular-ui-kit-character.d.ts +104 -0
- package/types/lifecorner-angular-ui-kit-page-header.d.ts +6 -1
- package/types/lifecorner-angular-ui-kit-skeleton.d.ts +7 -1
- 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>
|
package/src/styles/_horizon.scss
CHANGED
|
@@ -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,
|
|
30
|
-
* from 1024 · 1280 · 1440 · 1920; with the
|
|
31
|
-
* on the land add its height, e.g. 136 px
|
|
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
|
|
83
|
-
//
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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, '
|
|
54
|
-
[1280, '
|
|
55
|
-
[1440, '
|
|
56
|
-
[1920, '
|
|
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`;
|
|
24
|
-
* `horizon`
|
|
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
|
|
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 };
|