@kywi-software/core 0.2.0 → 0.2.1
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/dist/admin/kywi-logo.d.ts +21 -0
- package/dist/admin/kywi-logo.d.ts.map +1 -0
- package/dist/admin/kywi-logo.js +123 -0
- package/dist/admin/kywi-logo.js.map +1 -0
- package/dist/admin/shell.d.ts.map +1 -1
- package/dist/admin/shell.js +62 -3
- package/dist/admin/shell.js.map +1 -1
- package/dist/admin/styles/admin.css +89 -23
- package/dist/admin/surfaces/login.d.ts.map +1 -1
- package/dist/admin/surfaces/login.js +2 -1
- package/dist/admin/surfaces/login.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface KywiLogoProps {
|
|
2
|
+
/** Applied to the wrapping element so callers size the mark via CSS. */
|
|
3
|
+
className?: string;
|
|
4
|
+
/** Accessible name for the mark; omit for a decorative render. */
|
|
5
|
+
title?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* The sidebar wordmark. Its type inherits `currentColor` (the shell sets the
|
|
9
|
+
* container to `--kywi-sidebar-fg-muted`), so it reads muted on the dark
|
|
10
|
+
* sidebar exactly like the nav links; the kiwi icon keeps its accent colours.
|
|
11
|
+
* The wrapper carries the accessible name when `title` is given; the inner SVG
|
|
12
|
+
* is `aria-hidden`/`focusable="false"` so it never double-announces. Size it via
|
|
13
|
+
* `className` in CSS.
|
|
14
|
+
*/
|
|
15
|
+
export declare function KywiLogo({ className, title }: KywiLogoProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
/**
|
|
17
|
+
* The dark-inked wordmark for LIGHT surfaces (login card, mobile bar). Reads
|
|
18
|
+
* as-is (baked dark type); same a11y contract as {@link KywiLogo}.
|
|
19
|
+
*/
|
|
20
|
+
export declare function KywiLogoDark({ className, title }: KywiLogoProps): import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
//# sourceMappingURL=kywi-logo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kywi-logo.d.ts","sourceRoot":"","sources":["../../src/admin/kywi-logo.tsx"],"names":[],"mappings":"AAyGA,MAAM,WAAW,aAAa;IAC5B,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAOD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,aAAa,2CAE3D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,aAAa,2CAE/D"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* The Kywi wordmark, inlined for package portability — in two ink variants.
|
|
5
|
+
*
|
|
6
|
+
* These ship inside the published `@kywi-software/core`. The copy-assets
|
|
7
|
+
* pipeline only handles `.css`, so the admin shell can NOT rely on the host app
|
|
8
|
+
* serving a static logo file. Embedding the SVG markup here keeps each mark
|
|
9
|
+
* self-contained: no external request, no runtime asset resolution, CSP-safe.
|
|
10
|
+
*
|
|
11
|
+
* The markup is the user's own trusted brand asset (a 1638×382 wordmark: an
|
|
12
|
+
* evergreen kiwi icon in lime / cream / brown plus a "kywi cms" wordmark),
|
|
13
|
+
* transcribed verbatim from `kywi-logo-admin.svg` / `kywi-logo-dark.svg` minus
|
|
14
|
+
* their XML prolog/DOCTYPE. It is static, not user input, so rendering via
|
|
15
|
+
* `dangerouslySetInnerHTML` is safe and avoids lossy hand-conversion to JSX.
|
|
16
|
+
* Each inner `<svg>` keeps `width/height="100%"` so the wrapper controls the
|
|
17
|
+
* rendered size via CSS; being SVG it stays crisp at 1x/2x.
|
|
18
|
+
*
|
|
19
|
+
* - {@link KywiLogo} — for the DARK sidebar. Its wordmark letterform fills
|
|
20
|
+
* are set to `currentColor`, so the type reads muted in whatever colour the
|
|
21
|
+
* container sets (the shell drives it to `--kywi-sidebar-fg-muted`, matching
|
|
22
|
+
* the nav links). The kiwi icon keeps its own lime/cream/brown accent.
|
|
23
|
+
* - {@link KywiLogoDark} — dark-inked wordmark for LIGHT surfaces (login card,
|
|
24
|
+
* mobile bar). Its type is baked dark ("kywi" near-black, "cms" sage) and it
|
|
25
|
+
* reads as-is; the icon is identical to the sidebar variant.
|
|
26
|
+
*/
|
|
27
|
+
// Sidebar variant: wordmark letterforms use `currentColor` (originally the sage
|
|
28
|
+
// rgb(147,162,155)); the kiwi icon fills are untouched.
|
|
29
|
+
const KYWI_LOGO_SVG = `<svg width="100%" height="100%" viewBox="0 0 1638 382" version="1.1" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid meet" focusable="false" aria-hidden="true" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
|
30
|
+
<g transform="matrix(1,0,0,1,-250.883526,-1750.483759)">
|
|
31
|
+
<g transform="matrix(0.66353,0,0,0.655692,203.466438,1720.661519)">
|
|
32
|
+
<path d="M74.92,322.575C75.601,318.757 79.645,296.104 86.442,275.482C115.006,188.814 175.647,128.787 188.854,116.889C218.22,90.432 363.041,-50.037 569.452,155.549C703.517,289.08 704.387,488.05 555.462,566.43C553.357,567.538 392.947,689.673 213.746,583.105C43.965,482.139 72.03,343.287 74.92,322.575Z" style="fill:rgb(62,55,44);"/>
|
|
33
|
+
<path d="M622.793,283.427C624.831,289.979 633.104,314.652 637.073,343.563C653.923,466.31 574.822,569.529 425.492,562.674C353.307,559.36 242.682,510.807 200.178,357.586C139.356,138.327 280.068,44.311 418.446,75.75C516.931,98.126 591.345,193.822 622.793,283.427Z" style="fill:rgb(193,218,73);"/>
|
|
34
|
+
<path d="M513.544,331.501C515.68,362.402 541.857,357.135 536.46,377.489C530.389,400.387 502.743,368.874 474.123,406.181C462.208,421.713 449.434,390.522 418.593,410.662C410.614,415.873 397.039,436.291 383.991,417.269C381.736,413.98 383.969,378.816 332.521,381.787C329.873,381.94 314.326,386.555 308.577,373.462C299.347,352.442 344.149,351.621 322.124,306.696C313.914,289.95 288.374,279.134 300.802,263.699C310.083,252.173 330.664,265.662 337.813,246.598C340.238,240.132 349.192,237.008 353.407,237.989C366.262,240.981 375.58,245.57 391.303,232.294C393.17,230.718 403.174,209.249 418.44,220.584C424.595,225.154 433.191,260.255 477.539,249.694C478.982,249.351 505.368,235.637 508.697,257.461C509.66,263.781 492.767,290.998 507.761,305.244C514.775,311.908 516.058,312.588 513.544,331.501Z" style="fill:rgb(244,243,217);"/>
|
|
35
|
+
<path d="M119.148,271.464C119.332,273.524 119.29,273.364 119.332,273.524C125.74,298.318 152.643,461.656 295.403,537.699C323.233,552.524 324.014,552.265 326.603,551.41C373.737,581.279 392.348,580.442 405.791,590.057C407.429,591.229 436.994,590.842 412.572,593.906C406.06,594.723 274.615,623.968 155.846,500.206C80.323,421.507 99.405,314.009 119.148,271.464Z" style="fill:rgb(139,114,75);"/>
|
|
36
|
+
<path d="M119.148,271.464C121.59,264.353 131.492,235.515 163.698,188.711C180.541,164.232 138.783,222.452 161.728,313.44C205.714,487.866 316.653,543.983 326.603,551.41C324.014,552.265 323.233,552.524 295.403,537.699C152.643,461.656 125.74,298.318 119.332,273.524C119.29,273.364 119.332,273.524 119.148,271.464Z" style="fill:rgb(254,253,252);"/>
|
|
37
|
+
<path d="M258.489,331.134C257.677,331.009 244.579,332.963 245.37,312.495C246.546,282.073 296.918,309.915 295.456,312.473C295.409,312.556 286.979,319.492 277.222,325.002C268.5,329.928 268.326,329.362 258.489,331.134Z" style="fill:rgb(61,56,41);"/>
|
|
38
|
+
<path d="M466.752,477.448C466.642,476.515 464.315,465.346 467.053,443.361C467.078,443.163 467.389,440.662 469.423,442.587C504.021,475.329 497.843,486.63 497.622,487.538C497.075,489.791 475.196,510.764 466.752,477.448Z" style="fill:rgb(61,56,42);"/>
|
|
39
|
+
<path d="M402.881,483.562C402.676,484.303 402.348,498.978 384.577,495.114C356.356,488.979 392.378,440.566 394.341,441.811C395.166,442.334 402.306,462.043 403.106,475.539C403.349,479.646 403.252,479.557 402.881,483.562Z" style="fill:rgb(61,56,42);"/>
|
|
40
|
+
<path d="M436.16,177.54C435.987,168.61 433.425,141.292 447.507,137.537C452.523,136.2 465.642,142.243 468.163,150.601C472.672,165.552 441.604,184.139 438.572,185.681C436.455,186.758 437.237,184.809 436.16,177.54Z" style="fill:rgb(63,57,43);"/>
|
|
41
|
+
<path d="M436.16,177.54C435.987,168.61 433.425,141.292 447.507,137.537C452.523,136.2 465.642,142.243 468.163,150.601C472.672,165.552 441.604,184.139 438.572,185.681C436.455,186.758 437.237,184.809 436.16,177.54Z" style="fill:rgb(63,57,43);"/>
|
|
42
|
+
<path d="M361.493,181.511C358.775,179.804 328.451,160.759 339.807,147.761C365.046,118.87 373.517,182.868 371.505,185.503C369.954,187.535 369.637,185.685 361.493,181.511Z" style="fill:rgb(62,55,41);"/>
|
|
43
|
+
<path d="M286.603,197.29C295.295,203.17 299.223,207.121 309.195,226.63C311.297,230.741 308.128,229.682 303.502,229.584C294.128,229.385 270.292,228.46 266.643,215.468C265.721,212.187 270.091,191.401 286.603,197.29Z" style="fill:rgb(61,56,42);"/>
|
|
44
|
+
<path d="M556.809,211.504C555.748,215.289 552.365,227.362 513.492,234.708C509.548,235.454 522.913,204.35 537.6,198.827C541.112,197.507 554.005,197.82 556.809,211.504Z" style="fill:rgb(61,57,41);"/>
|
|
45
|
+
<path d="M306.443,398.045C307.789,397.956 320.925,397.092 323.301,397.998C324.533,398.467 324.796,399.308 317.029,413.227C300.015,443.721 287.206,430.037 285.699,415.47C284.043,399.462 304.801,398.377 306.443,398.045Z" style="fill:rgb(62,55,42);"/>
|
|
46
|
+
<path d="M561.502,443.234C557.706,442.53 545.449,440.259 532.771,404.461C531.968,402.192 538.911,404.569 539.414,404.741C588.763,421.635 572.295,441.201 561.502,443.234Z" style="fill:rgb(62,57,42);"/>
|
|
47
|
+
<path d="M556.456,309.405C556.705,309.316 568.964,303.637 577.472,305.622C584.121,307.174 585.878,312.713 586.164,313.613C591.909,331.72 574.377,334.052 540.714,320.037C535.817,317.999 555.082,310.073 556.456,309.405Z" style="fill:rgb(60,56,41);"/>
|
|
48
|
+
<path d="M200.51,189.534C200.844,190.113 203.454,194.634 200.889,197.874C200.475,198.397 197.132,198.154 200.51,189.534Z" style="fill:rgb(188,213,60);"/>
|
|
49
|
+
</g>
|
|
50
|
+
<g transform="matrix(1.057475,0,0,1.044982,-306.768598,358.301466)">
|
|
51
|
+
<path d="M921.275,1400.391C921.275,1397.013 930.881,1395.324 950.092,1395.324C968.036,1395.958 977.008,1397.33 977.008,1399.441L977.008,1521.041L1008.358,1463.091C1009.836,1459.924 1018.808,1458.341 1035.275,1458.341C1051.742,1458.341 1062.297,1459.396 1066.942,1461.508L1025.775,1528.641L1073.275,1617.624C1073.697,1618.469 1069.739,1619.155 1061.4,1619.683C1053.061,1620.21 1046.147,1620.474 1040.658,1620.474C1020.392,1620.474 1009.52,1619.524 1008.042,1617.624L976.692,1547.324L976.692,1617.308C976.692,1620.052 967.456,1621.424 948.983,1621.424C930.511,1621.424 921.275,1620.158 921.275,1617.624L921.275,1400.391Z" style="fill:currentColor;fill-rule:nonzero;"/>
|
|
52
|
+
<path d="M1067.258,1462.774C1067.258,1460.452 1076.917,1459.291 1096.233,1459.291C1115.55,1459.291 1125.525,1460.346 1126.158,1462.458L1148.958,1537.191L1170.808,1461.824C1171.653,1460.135 1178.197,1459.291 1190.442,1459.291C1218.52,1459.291 1231.925,1460.663 1230.658,1463.408L1156.242,1675.258C1156.031,1676.524 1150.278,1677.158 1138.983,1677.158C1127.689,1677.158 1117.186,1676.788 1107.475,1676.049C1097.764,1675.31 1093.12,1674.413 1093.542,1673.358L1121.092,1606.858L1067.258,1462.774Z" style="fill:currentColor;fill-rule:nonzero;"/>
|
|
53
|
+
<path d="M1412.742,1462.774C1412.742,1460.874 1418.547,1459.924 1430.158,1459.924C1456.336,1459.924 1469.214,1460.769 1468.792,1462.458L1437.758,1616.358C1437.125,1619.735 1425.408,1621.424 1402.608,1621.424C1379.808,1621.424 1368.092,1619.735 1367.458,1616.358L1354.475,1545.424L1338.325,1616.358C1337.692,1619.524 1325.606,1621.108 1302.067,1621.108C1278.528,1621.108 1266.442,1619.208 1265.808,1615.408L1237.625,1461.191C1236.992,1459.924 1246.07,1459.291 1264.858,1459.291C1283.436,1459.502 1292.725,1459.924 1292.725,1460.558L1307.292,1567.591L1333.575,1461.824C1333.997,1460.558 1340.964,1459.924 1354.475,1459.924C1367.986,1459.924 1374.953,1460.558 1375.375,1461.824L1401.342,1566.324L1412.742,1462.774Z" style="fill:currentColor;fill-rule:nonzero;"/>
|
|
54
|
+
<path d="M1544.475,1617.624C1544.475,1619.313 1534.817,1620.158 1515.5,1620.158C1496.183,1620.158 1486.525,1619.419 1486.525,1617.941L1486.525,1462.458C1486.525,1460.98 1496.183,1460.241 1515.5,1460.241C1534.817,1460.241 1544.475,1460.874 1544.475,1462.141L1544.475,1617.624Z" style="fill:currentColor;fill-rule:nonzero;"/>
|
|
55
|
+
<g transform="matrix(1.51344,0,0,1.51344,845.287816,1161.930237)">
|
|
56
|
+
<path d="M436.16,177.54C435.987,168.61 433.425,141.292 447.507,137.537C452.523,136.2 465.642,142.243 468.163,150.601C472.672,165.552 441.604,184.139 438.572,185.681C436.455,186.758 437.237,184.809 436.16,177.54Z" style="fill:currentColor;"/>
|
|
57
|
+
</g>
|
|
58
|
+
</g>
|
|
59
|
+
<g transform="matrix(1,0,0,1,-205,100)">
|
|
60
|
+
<text x="1551.595px" y="1942.447px" style="font-family:'AvenirNext-Regular', 'Avenir Next', sans-serif;font-size:316.667px;fill:currentColor;">c<tspan x="1703.595px 1967.378px " y="1942.447px 1942.447px ">ms</tspan></text>
|
|
61
|
+
</g>
|
|
62
|
+
</g>
|
|
63
|
+
</svg>`;
|
|
64
|
+
// Light-surface variant: wordmark baked dark ("kywi" rgb(25,36,30), "cms" sage);
|
|
65
|
+
// same kiwi icon. Reads as-is on light backgrounds (login card, mobile bar).
|
|
66
|
+
const KYWI_LOGO_DARK_SVG = `<svg width="100%" height="100%" viewBox="0 0 1638 382" version="1.1" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid meet" focusable="false" aria-hidden="true" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
|
67
|
+
<g transform="matrix(1,0,0,1,-265.728614,-2746.180207)">
|
|
68
|
+
<g transform="matrix(0.66353,0,0,0.655692,218.311526,2716.357967)">
|
|
69
|
+
<path d="M74.92,322.575C75.601,318.757 79.645,296.104 86.442,275.482C115.006,188.814 175.647,128.787 188.854,116.889C218.22,90.432 363.041,-50.037 569.452,155.549C703.517,289.08 704.387,488.05 555.462,566.43C553.357,567.538 392.947,689.673 213.746,583.105C43.965,482.139 72.03,343.287 74.92,322.575Z" style="fill:rgb(62,55,44);"/>
|
|
70
|
+
<path d="M622.793,283.427C624.831,289.979 633.104,314.652 637.073,343.563C653.923,466.31 574.822,569.529 425.492,562.674C353.307,559.36 242.682,510.807 200.178,357.586C139.356,138.327 280.068,44.311 418.446,75.75C516.931,98.126 591.345,193.822 622.793,283.427Z" style="fill:rgb(193,218,73);"/>
|
|
71
|
+
<path d="M513.544,331.501C515.68,362.402 541.857,357.135 536.46,377.489C530.389,400.387 502.743,368.874 474.123,406.181C462.208,421.713 449.434,390.522 418.593,410.662C410.614,415.873 397.039,436.291 383.991,417.269C381.736,413.98 383.969,378.816 332.521,381.787C329.873,381.94 314.326,386.555 308.577,373.462C299.347,352.442 344.149,351.621 322.124,306.696C313.914,289.95 288.374,279.134 300.802,263.699C310.083,252.173 330.664,265.662 337.813,246.598C340.238,240.132 349.192,237.008 353.407,237.989C366.262,240.981 375.58,245.57 391.303,232.294C393.17,230.718 403.174,209.249 418.44,220.584C424.595,225.154 433.191,260.255 477.539,249.694C478.982,249.351 505.368,235.637 508.697,257.461C509.66,263.781 492.767,290.998 507.761,305.244C514.775,311.908 516.058,312.588 513.544,331.501Z" style="fill:rgb(244,243,217);"/>
|
|
72
|
+
<path d="M119.148,271.464C119.332,273.524 119.29,273.364 119.332,273.524C125.74,298.318 152.643,461.656 295.403,537.699C323.233,552.524 324.014,552.265 326.603,551.41C373.737,581.279 392.348,580.442 405.791,590.057C407.429,591.229 436.994,590.842 412.572,593.906C406.06,594.723 274.615,623.968 155.846,500.206C80.323,421.507 99.405,314.009 119.148,271.464Z" style="fill:rgb(139,114,75);"/>
|
|
73
|
+
<path d="M119.148,271.464C121.59,264.353 131.492,235.515 163.698,188.711C180.541,164.232 138.783,222.452 161.728,313.44C205.714,487.866 316.653,543.983 326.603,551.41C324.014,552.265 323.233,552.524 295.403,537.699C152.643,461.656 125.74,298.318 119.332,273.524C119.29,273.364 119.332,273.524 119.148,271.464Z" style="fill:rgb(254,253,252);"/>
|
|
74
|
+
<path d="M258.489,331.134C257.677,331.009 244.579,332.963 245.37,312.495C246.546,282.073 296.918,309.915 295.456,312.473C295.409,312.556 286.979,319.492 277.222,325.002C268.5,329.928 268.326,329.362 258.489,331.134Z" style="fill:rgb(61,56,41);"/>
|
|
75
|
+
<path d="M466.752,477.448C466.642,476.515 464.315,465.346 467.053,443.361C467.078,443.163 467.389,440.662 469.423,442.587C504.021,475.329 497.843,486.63 497.622,487.538C497.075,489.791 475.196,510.764 466.752,477.448Z" style="fill:rgb(61,56,42);"/>
|
|
76
|
+
<path d="M402.881,483.562C402.676,484.303 402.348,498.978 384.577,495.114C356.356,488.979 392.378,440.566 394.341,441.811C395.166,442.334 402.306,462.043 403.106,475.539C403.349,479.646 403.252,479.557 402.881,483.562Z" style="fill:rgb(61,56,42);"/>
|
|
77
|
+
<path d="M436.16,177.54C435.987,168.61 433.425,141.292 447.507,137.537C452.523,136.2 465.642,142.243 468.163,150.601C472.672,165.552 441.604,184.139 438.572,185.681C436.455,186.758 437.237,184.809 436.16,177.54Z" style="fill:rgb(63,57,43);"/>
|
|
78
|
+
<path d="M436.16,177.54C435.987,168.61 433.425,141.292 447.507,137.537C452.523,136.2 465.642,142.243 468.163,150.601C472.672,165.552 441.604,184.139 438.572,185.681C436.455,186.758 437.237,184.809 436.16,177.54Z" style="fill:rgb(63,57,43);"/>
|
|
79
|
+
<path d="M361.493,181.511C358.775,179.804 328.451,160.759 339.807,147.761C365.046,118.87 373.517,182.868 371.505,185.503C369.954,187.535 369.637,185.685 361.493,181.511Z" style="fill:rgb(62,55,41);"/>
|
|
80
|
+
<path d="M286.603,197.29C295.295,203.17 299.223,207.121 309.195,226.63C311.297,230.741 308.128,229.682 303.502,229.584C294.128,229.385 270.292,228.46 266.643,215.468C265.721,212.187 270.091,191.401 286.603,197.29Z" style="fill:rgb(61,56,42);"/>
|
|
81
|
+
<path d="M556.809,211.504C555.748,215.289 552.365,227.362 513.492,234.708C509.548,235.454 522.913,204.35 537.6,198.827C541.112,197.507 554.005,197.82 556.809,211.504Z" style="fill:rgb(61,57,41);"/>
|
|
82
|
+
<path d="M306.443,398.045C307.789,397.956 320.925,397.092 323.301,397.998C324.533,398.467 324.796,399.308 317.029,413.227C300.015,443.721 287.206,430.037 285.699,415.47C284.043,399.462 304.801,398.377 306.443,398.045Z" style="fill:rgb(62,55,42);"/>
|
|
83
|
+
<path d="M561.502,443.234C557.706,442.53 545.449,440.259 532.771,404.461C531.968,402.192 538.911,404.569 539.414,404.741C588.763,421.635 572.295,441.201 561.502,443.234Z" style="fill:rgb(62,57,42);"/>
|
|
84
|
+
<path d="M556.456,309.405C556.705,309.316 568.964,303.637 577.472,305.622C584.121,307.174 585.878,312.713 586.164,313.613C591.909,331.72 574.377,334.052 540.714,320.037C535.817,317.999 555.082,310.073 556.456,309.405Z" style="fill:rgb(60,56,41);"/>
|
|
85
|
+
<path d="M200.51,189.534C200.844,190.113 203.454,194.634 200.889,197.874C200.475,198.397 197.132,198.154 200.51,189.534Z" style="fill:rgb(188,213,60);"/>
|
|
86
|
+
</g>
|
|
87
|
+
<g transform="matrix(1.057475,0,0,1.044982,-291.92351,1353.997914)">
|
|
88
|
+
<path d="M921.275,1400.391C921.275,1397.013 930.881,1395.324 950.092,1395.324C968.036,1395.958 977.008,1397.33 977.008,1399.441L977.008,1521.041L1008.358,1463.091C1009.836,1459.924 1018.808,1458.341 1035.275,1458.341C1051.742,1458.341 1062.297,1459.396 1066.942,1461.508L1025.775,1528.641L1073.275,1617.624C1073.697,1618.469 1069.739,1619.155 1061.4,1619.683C1053.061,1620.21 1046.147,1620.474 1040.658,1620.474C1020.392,1620.474 1009.52,1619.524 1008.042,1617.624L976.692,1547.324L976.692,1617.308C976.692,1620.052 967.456,1621.424 948.983,1621.424C930.511,1621.424 921.275,1620.158 921.275,1617.624L921.275,1400.391Z" style="fill:rgb(25,36,30);fill-rule:nonzero;"/>
|
|
89
|
+
<path d="M1067.258,1462.774C1067.258,1460.452 1076.917,1459.291 1096.233,1459.291C1115.55,1459.291 1125.525,1460.346 1126.158,1462.458L1148.958,1537.191L1170.808,1461.824C1171.653,1460.135 1178.197,1459.291 1190.442,1459.291C1218.52,1459.291 1231.925,1460.663 1230.658,1463.408L1156.242,1675.258C1156.031,1676.524 1150.278,1677.158 1138.983,1677.158C1127.689,1677.158 1117.186,1676.788 1107.475,1676.049C1097.764,1675.31 1093.12,1674.413 1093.542,1673.358L1121.092,1606.858L1067.258,1462.774Z" style="fill:rgb(25,36,30);fill-rule:nonzero;"/>
|
|
90
|
+
<path d="M1412.742,1462.774C1412.742,1460.874 1418.547,1459.924 1430.158,1459.924C1456.336,1459.924 1469.214,1460.769 1468.792,1462.458L1437.758,1616.358C1437.125,1619.735 1425.408,1621.424 1402.608,1621.424C1379.808,1621.424 1368.092,1619.735 1367.458,1616.358L1354.475,1545.424L1338.325,1616.358C1337.692,1619.524 1325.606,1621.108 1302.067,1621.108C1278.528,1621.108 1266.442,1619.208 1265.808,1615.408L1237.625,1461.191C1236.992,1459.924 1246.07,1459.291 1264.858,1459.291C1283.436,1459.502 1292.725,1459.924 1292.725,1460.558L1307.292,1567.591L1333.575,1461.824C1333.997,1460.558 1340.964,1459.924 1354.475,1459.924C1367.986,1459.924 1374.953,1460.558 1375.375,1461.824L1401.342,1566.324L1412.742,1462.774Z" style="fill:rgb(25,36,30);fill-rule:nonzero;"/>
|
|
91
|
+
<path d="M1544.475,1617.624C1544.475,1619.313 1534.817,1620.158 1515.5,1620.158C1496.183,1620.158 1486.525,1619.419 1486.525,1617.941L1486.525,1462.458C1486.525,1460.98 1496.183,1460.241 1515.5,1460.241C1534.817,1460.241 1544.475,1460.874 1544.475,1462.141L1544.475,1617.624Z" style="fill:rgb(25,36,30);fill-rule:nonzero;"/>
|
|
92
|
+
<g transform="matrix(1.51344,0,0,1.51344,845.287816,1161.930237)">
|
|
93
|
+
<path d="M436.16,177.54C435.987,168.61 433.425,141.292 447.507,137.537C452.523,136.2 465.642,142.243 468.163,150.601C472.672,165.552 441.604,184.139 438.572,185.681C436.455,186.758 437.237,184.809 436.16,177.54Z" style="fill:rgb(25,36,30);"/>
|
|
94
|
+
</g>
|
|
95
|
+
</g>
|
|
96
|
+
<g transform="matrix(1,0,0,1,-190.154912,1095.696448)">
|
|
97
|
+
<text x="1551.595px" y="1942.447px" style="font-family:'AvenirNext-Regular', 'Avenir Next', sans-serif;font-size:316.667px;fill:rgb(147,162,155);">c<tspan x="1703.595px 1967.378px " y="1942.447px 1942.447px ">ms</tspan></text>
|
|
98
|
+
</g>
|
|
99
|
+
</g>
|
|
100
|
+
</svg>`;
|
|
101
|
+
function renderMark(svg, className, title) {
|
|
102
|
+
const a11y = title ? { role: 'img', 'aria-label': title } : { 'aria-hidden': true };
|
|
103
|
+
return _jsx("span", { className: className, ...a11y, dangerouslySetInnerHTML: { __html: svg } });
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* The sidebar wordmark. Its type inherits `currentColor` (the shell sets the
|
|
107
|
+
* container to `--kywi-sidebar-fg-muted`), so it reads muted on the dark
|
|
108
|
+
* sidebar exactly like the nav links; the kiwi icon keeps its accent colours.
|
|
109
|
+
* The wrapper carries the accessible name when `title` is given; the inner SVG
|
|
110
|
+
* is `aria-hidden`/`focusable="false"` so it never double-announces. Size it via
|
|
111
|
+
* `className` in CSS.
|
|
112
|
+
*/
|
|
113
|
+
export function KywiLogo({ className, title }) {
|
|
114
|
+
return renderMark(KYWI_LOGO_SVG, className, title);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* The dark-inked wordmark for LIGHT surfaces (login card, mobile bar). Reads
|
|
118
|
+
* as-is (baked dark type); same a11y contract as {@link KywiLogo}.
|
|
119
|
+
*/
|
|
120
|
+
export function KywiLogoDark({ className, title }) {
|
|
121
|
+
return renderMark(KYWI_LOGO_DARK_SVG, className, title);
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=kywi-logo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kywi-logo.js","sourceRoot":"","sources":["../../src/admin/kywi-logo.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAIZ;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,gFAAgF;AAChF,wDAAwD;AACxD,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkCf,CAAA;AAEP,iFAAiF;AACjF,6EAA6E;AAC7E,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkCpB,CAAA;AASP,SAAS,UAAU,CAAC,GAAW,EAAE,SAAkB,EAAE,KAAc;IACjE,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAY,CAAC,CAAC,CAAE,EAAE,aAAa,EAAE,IAAI,EAAY,CAAA;IACzG,OAAO,eAAM,SAAS,EAAE,SAAS,KAAM,IAAI,EAAE,uBAAuB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,GAAI,CAAA;AAC3F,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAiB;IAC1D,OAAO,UAAU,CAAC,aAAa,EAAE,SAAS,EAAE,KAAK,CAAC,CAAA;AACpD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,EAAE,SAAS,EAAE,KAAK,EAAiB;IAC9D,OAAO,UAAU,CAAC,kBAAkB,EAAE,SAAS,EAAE,KAAK,CAAC,CAAA;AACzD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/admin/shell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,UAAU,CAAA;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/admin/shell.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,UAAU,CAAA;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAGtD,UAAU,eAAe;IACvB;;;;;;;OAOG;IACH,MAAM,EAAE,UAAU,CAAA;IAClB;;;;OAIG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;IAC3B,gEAAgE;IAChE,KAAK,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAA;IACrC;;;;;OAKG;IACH,SAAS,CAAC,EAAE,YAAY,EAAE,GAAG,SAAS,CAAA;IACtC,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AA+GD,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,eAAe,2CA8GpG"}
|
package/dist/admin/shell.js
CHANGED
|
@@ -2,9 +2,35 @@
|
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import { useState, useEffect } from 'react';
|
|
4
4
|
import { buildAdminNav } from './nav.js';
|
|
5
|
-
|
|
5
|
+
import { KywiLogo, KywiLogoDark } from './kywi-logo.js';
|
|
6
|
+
/** localStorage key persisting per-group expand/collapse overrides. */
|
|
7
|
+
const NAV_COLLAPSE_KEY = 'kywi-admin-nav-groups';
|
|
8
|
+
/**
|
|
9
|
+
* Does `currentPath` fall inside this group — either under the group's own href
|
|
10
|
+
* or under any of its child hrefs (some children, e.g. Settings → Content Types,
|
|
11
|
+
* live outside the group's href prefix)? Drives the active-group-expanded default.
|
|
12
|
+
*/
|
|
13
|
+
function isGroupActive(item, currentPath) {
|
|
14
|
+
const within = (href) => currentPath === href || currentPath.startsWith(href + '/');
|
|
15
|
+
if (within(item.href))
|
|
16
|
+
return true;
|
|
17
|
+
return (item.children ?? []).some(c => within(c.href));
|
|
18
|
+
}
|
|
19
|
+
/** Down-chevron disclosure glyph; rotates via CSS from the group's data-expanded. */
|
|
20
|
+
function NavChevron() {
|
|
21
|
+
return (_jsx("svg", { className: "kywi-nav-chevron", width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.7", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", focusable: "false", children: _jsx("path", { d: "M4 6l4 4 4-4" }) }));
|
|
22
|
+
}
|
|
23
|
+
function NavItem({ item, currentPath, depth = 0, expanded, onToggle, }) {
|
|
6
24
|
const isActive = currentPath === item.href || currentPath.startsWith(item.href + '/');
|
|
7
|
-
|
|
25
|
+
const hasChildren = Array.isArray(item.children) && item.children.length > 0;
|
|
26
|
+
// Only top-level groups (depth 0) with children AND a toggle handler collapse.
|
|
27
|
+
const collapsible = depth === 0 && hasChildren && typeof onToggle === 'function';
|
|
28
|
+
const isExpanded = collapsible ? expanded !== false : true;
|
|
29
|
+
const childrenId = collapsible
|
|
30
|
+
? `kywi-nav-group-${item.href.replace(/[^a-z0-9]+/gi, '-').replace(/^-+|-+$/g, '')}`
|
|
31
|
+
: undefined;
|
|
32
|
+
const link = (_jsx("a", { href: item.href, className: `kywi-nav-link ${isActive ? 'kywi-nav-active' : ''}`, style: { paddingLeft: `${(depth + 1) * 16}px` }, children: item.label }));
|
|
33
|
+
return (_jsxs("li", { className: `kywi-nav-item${collapsible ? ' kywi-nav-group' : ''}`, "data-active": isActive, ...(collapsible ? { 'data-expanded': isExpanded } : {}), children: [collapsible ? (_jsxs("div", { className: "kywi-nav-group-row", children: [link, _jsx("button", { type: "button", className: "kywi-nav-toggle", "aria-expanded": isExpanded, "aria-controls": childrenId, "aria-label": `${isExpanded ? 'Collapse' : 'Expand'} ${item.label}`, onClick: () => onToggle(item), children: _jsx(NavChevron, {}) })] })) : (link), hasChildren && (_jsx("div", { className: "kywi-nav-children-wrap", children: _jsx("ul", { id: childrenId, className: "kywi-nav-children", ...(collapsible ? { 'aria-hidden': !isExpanded } : {}), children: item.children.map(child => (_jsx(NavItem, { item: child, currentPath: currentPath, depth: depth + 1 }, child.href))) }) }))] }));
|
|
8
34
|
}
|
|
9
35
|
export function AdminShell({ config, role, flags, pluginNav, currentPath, children }) {
|
|
10
36
|
// Role/flags (when provided) narrow the derived tree beyond the config ceiling.
|
|
@@ -19,6 +45,39 @@ export function AdminShell({ config, role, flags, pluginNav, currentPath, childr
|
|
|
19
45
|
// sidebar is always visible. Close the drawer whenever the route changes.
|
|
20
46
|
const [sidebarOpen, setSidebarOpen] = useState(false);
|
|
21
47
|
useEffect(() => { setSidebarOpen(false); }, [currentPath]);
|
|
22
|
-
|
|
48
|
+
// Per-group expand/collapse overrides (href → user's explicit choice). Empty
|
|
49
|
+
// until hydrated from localStorage so the server render and the first client
|
|
50
|
+
// render agree (both fall back to the active-group-expanded default); the
|
|
51
|
+
// effect then applies any persisted choices. A group with no override follows
|
|
52
|
+
// the default, so navigating auto-expands the newly-active section.
|
|
53
|
+
const [overrides, setOverrides] = useState({});
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
try {
|
|
56
|
+
const raw = window.localStorage.getItem(NAV_COLLAPSE_KEY);
|
|
57
|
+
if (raw) {
|
|
58
|
+
const parsed = JSON.parse(raw);
|
|
59
|
+
if (parsed && typeof parsed === 'object')
|
|
60
|
+
setOverrides(parsed);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// Best-effort: a storage hiccup just leaves the active-default layout.
|
|
65
|
+
}
|
|
66
|
+
}, []);
|
|
67
|
+
const isExpanded = (item) => item.href in overrides ? overrides[item.href] : isGroupActive(item, currentPath);
|
|
68
|
+
const toggleGroup = (item) => {
|
|
69
|
+
setOverrides(prev => {
|
|
70
|
+
const current = item.href in prev ? prev[item.href] : isGroupActive(item, currentPath);
|
|
71
|
+
const next = { ...prev, [item.href]: !current };
|
|
72
|
+
try {
|
|
73
|
+
window.localStorage.setItem(NAV_COLLAPSE_KEY, JSON.stringify(next));
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Non-fatal: the toggle still takes effect for this session.
|
|
77
|
+
}
|
|
78
|
+
return next;
|
|
79
|
+
});
|
|
80
|
+
};
|
|
81
|
+
return (_jsxs("div", { className: "kywi-admin-shell", "data-sidebar-open": sidebarOpen ? 'true' : 'false', children: [_jsx("button", { type: "button", className: "kywi-admin-scrim", "aria-label": "Close navigation", tabIndex: sidebarOpen ? 0 : -1, onClick: () => setSidebarOpen(false) }), _jsx("aside", { id: "kywi-admin-sidebar", className: "kywi-admin-sidebar", children: _jsxs("div", { className: "kywi-admin-sidebar-sticky", children: [_jsx("div", { className: "kywi-admin-logo", children: _jsx("a", { href: "/admin/dashboard", className: "kywi-admin-logo-link", "aria-label": "Kywi \u2014 go to dashboard", children: _jsx(KywiLogo, { className: "kywi-admin-logo-mark" }) }) }), _jsxs("nav", { className: "kywi-admin-nav", children: [_jsx("ul", { children: nav.map(item => (_jsx(NavItem, { item: item, currentPath: currentPath, expanded: isExpanded(item), onToggle: toggleGroup }, item.href))) }), pluginNav && pluginNav.length > 0 && (_jsxs(_Fragment, { children: [_jsx("div", { className: "kywi-admin-nav-section-label", children: "Plugins" }), _jsx("ul", { children: pluginNav.map(item => _jsx(NavItem, { item: item, currentPath: currentPath }, item.href)) })] }))] })] }) }), _jsxs("main", { className: "kywi-admin-main", children: [_jsxs("div", { className: "kywi-admin-mobile-bar", children: [_jsxs("button", { type: "button", className: "kywi-admin-hamburger", "aria-label": "Open navigation", "aria-controls": "kywi-admin-sidebar", "aria-expanded": sidebarOpen, onClick: () => setSidebarOpen(open => !open), children: [_jsx("span", { className: "kywi-admin-hamburger-bar" }), _jsx("span", { className: "kywi-admin-hamburger-bar" }), _jsx("span", { className: "kywi-admin-hamburger-bar" })] }), _jsx("a", { href: "/admin/dashboard", className: "kywi-admin-mobile-brand", "aria-label": "Kywi \u2014 go to dashboard", children: _jsx(KywiLogoDark, { className: "kywi-admin-mobile-logo" }) })] }), children] })] }));
|
|
23
82
|
}
|
|
24
83
|
//# sourceMappingURL=shell.js.map
|
package/dist/admin/shell.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/admin/shell.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGlD,OAAO,EAAE,aAAa,EAAqB,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/admin/shell.tsx"],"names":[],"mappings":"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"}
|
|
@@ -287,29 +287,32 @@
|
|
|
287
287
|
}
|
|
288
288
|
.kywi-admin-sidebar-sticky::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.16); background-clip: content-box; }
|
|
289
289
|
|
|
290
|
+
/* ---- Brand mark ------------------------------------------------------- */
|
|
291
|
+
/* The wordmark sits directly on the dark sidebar (no plate). Its type inherits
|
|
292
|
+
`currentColor`, which we drive to the muted nav-link colour so the wordmark
|
|
293
|
+
reads uniformly muted — exactly like the nav text beside it — while the kiwi
|
|
294
|
+
icon keeps its lime/cream accent as the single pop of colour. */
|
|
290
295
|
.kywi-admin-logo {
|
|
291
296
|
padding: var(--kywi-space-2) var(--kywi-space-5) var(--kywi-space-5);
|
|
292
297
|
margin-bottom: var(--kywi-space-2);
|
|
293
298
|
}
|
|
294
|
-
.kywi-admin-logo
|
|
299
|
+
.kywi-admin-sidebar .kywi-admin-logo-link {
|
|
295
300
|
display: inline-flex;
|
|
296
301
|
align-items: center;
|
|
297
|
-
|
|
298
|
-
color: #fff;
|
|
299
|
-
font-size: var(--kywi-text-md);
|
|
300
|
-
font-weight: var(--kywi-weight-bold);
|
|
301
|
-
letter-spacing: var(--kywi-tracking-tight);
|
|
302
|
+
color: var(--kywi-sidebar-fg-muted);
|
|
302
303
|
text-decoration: none;
|
|
304
|
+
transition: color var(--kywi-dur) var(--kywi-ease), opacity var(--kywi-dur) var(--kywi-ease);
|
|
303
305
|
}
|
|
304
|
-
.kywi-admin-logo
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
height: 10px;
|
|
308
|
-
border-radius: var(--kywi-radius-pill);
|
|
309
|
-
background: var(--kywi-sidebar-accent);
|
|
310
|
-
box-shadow: 0 0 0 3px rgba(87, 201, 156, 0.22);
|
|
311
|
-
flex-shrink: 0;
|
|
306
|
+
.kywi-admin-sidebar .kywi-admin-logo-link:hover {
|
|
307
|
+
text-decoration: none;
|
|
308
|
+
color: var(--kywi-sidebar-fg);
|
|
312
309
|
}
|
|
310
|
+
.kywi-admin-logo-mark {
|
|
311
|
+
display: block;
|
|
312
|
+
width: 156px;
|
|
313
|
+
aspect-ratio: 1638 / 382;
|
|
314
|
+
}
|
|
315
|
+
.kywi-admin-logo-mark > svg { display: block; width: 100%; height: 100%; }
|
|
313
316
|
|
|
314
317
|
.kywi-admin-nav ul { list-style: none; margin: 0; padding: 0; }
|
|
315
318
|
.kywi-admin-nav > ul { padding: 0 var(--kywi-space-3); }
|
|
@@ -362,6 +365,61 @@
|
|
|
362
365
|
.kywi-admin-sidebar .kywi-nav-children .kywi-nav-link { font-size: var(--kywi-text-xs); padding-top: 5px; padding-bottom: 5px; }
|
|
363
366
|
.kywi-admin-sidebar :focus-visible { box-shadow: 0 0 0 2px var(--kywi-sidebar-accent); }
|
|
364
367
|
|
|
368
|
+
/* ---- Collapsible groups ----------------------------------------------- */
|
|
369
|
+
/* A group row = the label link (navigates to group.href) + a chevron button
|
|
370
|
+
that toggles its children. Keeping the label a real link preserves keyboard
|
|
371
|
+
access to the group landing page; the separate button owns the disclosure. */
|
|
372
|
+
.kywi-admin-sidebar .kywi-nav-group-row { display: flex; align-items: center; gap: 2px; }
|
|
373
|
+
.kywi-admin-sidebar .kywi-nav-group-row .kywi-nav-link { flex: 1 1 auto; min-width: 0; }
|
|
374
|
+
.kywi-admin-sidebar .kywi-nav-toggle {
|
|
375
|
+
display: inline-flex;
|
|
376
|
+
align-items: center;
|
|
377
|
+
justify-content: center;
|
|
378
|
+
flex: 0 0 auto;
|
|
379
|
+
width: 28px;
|
|
380
|
+
height: 28px;
|
|
381
|
+
padding: 0;
|
|
382
|
+
margin: 0;
|
|
383
|
+
background: transparent;
|
|
384
|
+
border: 0;
|
|
385
|
+
border-radius: var(--kywi-radius);
|
|
386
|
+
color: var(--kywi-sidebar-fg-muted);
|
|
387
|
+
cursor: pointer;
|
|
388
|
+
transition: background var(--kywi-dur) var(--kywi-ease), color var(--kywi-dur) var(--kywi-ease);
|
|
389
|
+
}
|
|
390
|
+
.kywi-admin-sidebar .kywi-nav-toggle:hover {
|
|
391
|
+
background: var(--kywi-sidebar-hover-bg);
|
|
392
|
+
color: var(--kywi-sidebar-fg);
|
|
393
|
+
}
|
|
394
|
+
.kywi-admin-sidebar .kywi-nav-chevron {
|
|
395
|
+
display: block;
|
|
396
|
+
transition: transform var(--kywi-dur) var(--kywi-ease);
|
|
397
|
+
}
|
|
398
|
+
/* Chevron points down when open, rotates to point right when collapsed. */
|
|
399
|
+
.kywi-admin-sidebar .kywi-nav-group[data-expanded="false"] .kywi-nav-chevron { transform: rotate(-90deg); }
|
|
400
|
+
|
|
401
|
+
/* Children collapse via an animatable grid row (0fr → 1fr) so variable-height
|
|
402
|
+
groups slide cleanly; `overflow:hidden` on the list clips them at 0 height.
|
|
403
|
+
The section-8 prefers-reduced-motion block already zeroes these transitions. */
|
|
404
|
+
.kywi-admin-sidebar .kywi-nav-children-wrap {
|
|
405
|
+
display: grid;
|
|
406
|
+
grid-template-rows: 1fr;
|
|
407
|
+
transition: grid-template-rows var(--kywi-dur-slow) var(--kywi-ease);
|
|
408
|
+
}
|
|
409
|
+
.kywi-admin-sidebar .kywi-nav-group[data-expanded="false"] .kywi-nav-children-wrap { grid-template-rows: 0fr; }
|
|
410
|
+
.kywi-admin-sidebar .kywi-nav-children-wrap > .kywi-nav-children { overflow: hidden; min-height: 0; }
|
|
411
|
+
/* When collapsed, drop the children from the tab order + a11y tree (kept in the
|
|
412
|
+
DOM and query-able). Delay hiding until the collapse animation finishes;
|
|
413
|
+
reveal immediately on expand. */
|
|
414
|
+
.kywi-admin-sidebar .kywi-nav-group[data-expanded="false"] .kywi-nav-children {
|
|
415
|
+
visibility: hidden;
|
|
416
|
+
transition: visibility 0s linear var(--kywi-dur-slow);
|
|
417
|
+
}
|
|
418
|
+
.kywi-admin-sidebar .kywi-nav-group[data-expanded="true"] .kywi-nav-children {
|
|
419
|
+
visibility: visible;
|
|
420
|
+
transition: visibility 0s;
|
|
421
|
+
}
|
|
422
|
+
|
|
365
423
|
/* ---- Main + topbar ---------------------------------------------------- */
|
|
366
424
|
.kywi-admin-main {
|
|
367
425
|
flex: 1;
|
|
@@ -467,13 +525,15 @@
|
|
|
467
525
|
justify-content: center;
|
|
468
526
|
gap: var(--kywi-space-2);
|
|
469
527
|
}
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
528
|
+
/* The login card is the hero of the sign-in screen, on a light surface — the
|
|
529
|
+
dark-inked wordmark reads as-is, sized a touch larger than the sidebar. */
|
|
530
|
+
.kywi-admin-shell .kywi-admin-login-logo {
|
|
531
|
+
display: block;
|
|
532
|
+
width: 200px;
|
|
533
|
+
max-width: 72%;
|
|
534
|
+
aspect-ratio: 1638 / 382;
|
|
476
535
|
}
|
|
536
|
+
.kywi-admin-shell .kywi-admin-login-logo > svg { display: block; width: 100%; height: 100%; }
|
|
477
537
|
.kywi-admin-shell .kywi-admin-login-subtitle {
|
|
478
538
|
margin: calc(var(--kywi-space-2) * -1) 0 var(--kywi-space-2);
|
|
479
539
|
text-align: center;
|
|
@@ -2638,12 +2698,18 @@
|
|
|
2638
2698
|
background: var(--kywi-text);
|
|
2639
2699
|
border-radius: 2px;
|
|
2640
2700
|
}
|
|
2701
|
+
/* On the light mobile bar the wordmark reads directly — no chip needed. */
|
|
2641
2702
|
.kywi-admin-shell .kywi-admin-mobile-brand {
|
|
2642
|
-
|
|
2643
|
-
|
|
2644
|
-
letter-spacing: var(--kywi-tracking-tight);
|
|
2703
|
+
display: inline-flex;
|
|
2704
|
+
align-items: center;
|
|
2645
2705
|
text-decoration: none;
|
|
2646
2706
|
}
|
|
2707
|
+
.kywi-admin-shell .kywi-admin-mobile-logo {
|
|
2708
|
+
display: block;
|
|
2709
|
+
width: 128px;
|
|
2710
|
+
aspect-ratio: 1638 / 382;
|
|
2711
|
+
}
|
|
2712
|
+
.kywi-admin-shell .kywi-admin-mobile-logo > svg { display: block; width: 100%; height: 100%; }
|
|
2647
2713
|
|
|
2648
2714
|
/* Full-width content column with tighter gutters. */
|
|
2649
2715
|
.kywi-admin-shell .kywi-admin-main {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/admin/surfaces/login.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/admin/surfaces/login.tsx"],"names":[],"mappings":"AA+BA,MAAM,WAAW,iBAAiB;IAChC;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB;AAED;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAAE,QAAQ,SAAW,GAAG,MAAM,CAWrF;AAED,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,IAAI,EAAE,EAAE,iBAAiB,2CA8F/D"}
|
|
@@ -26,6 +26,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
26
26
|
*/
|
|
27
27
|
import { useState } from 'react';
|
|
28
28
|
import { setAuth } from '../../host-client/index.js';
|
|
29
|
+
import { KywiLogoDark } from '../kywi-logo.js';
|
|
29
30
|
/**
|
|
30
31
|
* Validate a candidate post-login redirect target. Only an internal
|
|
31
32
|
* `/admin/...` path is accepted — this is the open-redirect guard ported
|
|
@@ -87,6 +88,6 @@ export default function LoginSurface({ next }) {
|
|
|
87
88
|
// too; `kywi-admin-login` re-centres it as a standalone card page. The host
|
|
88
89
|
// is responsible for loading `@kywi-software/core/admin/styles.css` once
|
|
89
90
|
// (LoginSurface does not self-import it — see module doc / T13 report).
|
|
90
|
-
_jsx("div", { className: "kywi-admin-shell kywi-admin-login", children: _jsxs("form", { onSubmit: handleSubmit, className: "kywi-admin-login-card", children: [
|
|
91
|
+
_jsx("div", { className: "kywi-admin-shell kywi-admin-login", children: _jsxs("form", { onSubmit: handleSubmit, className: "kywi-admin-login-card", children: [_jsx("div", { className: "kywi-admin-login-brand", children: _jsx(KywiLogoDark, { className: "kywi-admin-login-logo", title: "Kywi" }) }), _jsx("p", { className: "kywi-admin-login-subtitle", children: "Sign in to your workspace" }), error && (_jsx("div", { className: "kywi-admin-callout kywi-admin-callout-danger", role: "alert", children: error })), _jsxs("label", { className: "kywi-admin-login-field", children: [_jsx("span", { className: "kywi-admin-login-label", children: "Email" }), _jsx("input", { type: "email", className: "kywi-input", value: email, onChange: e => setEmail(e.target.value), required: true, autoFocus: true })] }), _jsxs("label", { className: "kywi-admin-login-field", children: [_jsx("span", { className: "kywi-admin-login-label", children: "Password" }), _jsx("input", { type: "password", className: "kywi-input", value: password, onChange: e => setPassword(e.target.value), required: true })] }), _jsx("button", { type: "submit", disabled: loading, className: "kywi-btn kywi-btn-primary kywi-admin-login-submit", children: loading ? 'Signing in…' : 'Sign in' })] }) }));
|
|
91
92
|
}
|
|
92
93
|
//# sourceMappingURL=login.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/admin/surfaces/login.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAEZ;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAc,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/admin/surfaces/login.tsx"],"names":[],"mappings":"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"}
|