@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.
@@ -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;AAEtD,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;AAqBD,wBAAgB,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,eAAe,2CA2DpG"}
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"}
@@ -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
- function NavItem({ item, currentPath, depth = 0 }) {
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
- return (_jsxs("li", { className: "kywi-nav-item", "data-active": isActive, children: [_jsx("a", { href: item.href, className: `kywi-nav-link ${isActive ? 'kywi-nav-active' : ''}`, style: { paddingLeft: `${(depth + 1) * 16}px` }, children: item.label }), item.children && item.children.length > 0 && (_jsx("ul", { className: "kywi-nav-children", children: item.children.map(child => (_jsx(NavItem, { item: child, currentPath: currentPath, depth: depth + 1 }, child.href))) }))] }));
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
- 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", children: "Kywi Admin" }) }), _jsxs("nav", { className: "kywi-admin-nav", children: [_jsx("ul", { children: nav.map(item => _jsx(NavItem, { item: item, currentPath: currentPath }, 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", children: "Kywi Admin" })] }), children] })] }));
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
@@ -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;AAgC3D,SAAS,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,GAAG,CAAC,EAA+D;IAC5G,MAAM,QAAQ,GAAG,WAAW,KAAK,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,CAAA;IACrF,OAAO,CACL,cAAI,SAAS,EAAC,eAAe,iBAAc,QAAQ,aACjD,YAAG,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,iBAAiB,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,EAChF,KAAK,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,YAC/C,IAAI,CAAC,KAAK,GACT,EACH,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAC5C,aAAI,SAAS,EAAC,mBAAmB,YAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAC1B,KAAC,OAAO,IAAkB,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,IAAnE,KAAK,CAAC,IAAI,CAA6D,CACtF,CAAC,GACC,CACN,IACE,CACN,CAAA;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAmB;IACnG,gFAAgF;IAChF,MAAM,IAAI,GAAmD,EAAE,CAAA;IAC/D,IAAI,IAAI,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IACxC,IAAI,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IAC3C,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IACvC,8EAA8E;IAC9E,+EAA+E;IAC/E,0EAA0E;IAC1E,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACrD,SAAS,CAAC,GAAG,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;IAEzD,OAAO,CACL,eAAK,SAAS,EAAC,kBAAkB,uBAAoB,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,aAEjF,iBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,kBAAkB,gBACjB,kBAAkB,EAC7B,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC9B,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,GACpC,EACF,gBAAO,EAAE,EAAC,oBAAoB,EAAC,SAAS,EAAC,oBAAoB,YAG3D,eAAK,SAAS,EAAC,2BAA2B,aACxC,cAAK,SAAS,EAAC,iBAAiB,YAAC,YAAG,IAAI,EAAC,kBAAkB,2BAAe,GAAM,EAChF,eAAK,SAAS,EAAC,gBAAgB,aAC7B,uBAAK,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAC,OAAO,IAAiB,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,IAA/C,IAAI,CAAC,IAAI,CAA0C,CAAC,GAAM,EAC5F,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CACpC,8BACE,cAAK,SAAS,EAAC,8BAA8B,wBAAc,EAC3D,uBAAK,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAC,OAAO,IAAiB,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,IAA/C,IAAI,CAAC,IAAI,CAA0C,CAAC,GAAM,IAClG,CACJ,IACG,IACF,GACA,EACR,gBAAM,SAAS,EAAC,iBAAiB,aAE/B,eAAK,SAAS,EAAC,uBAAuB,aACpC,kBACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,sBAAsB,gBACrB,iBAAiB,mBACd,oBAAoB,mBACnB,WAAW,EAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,aAE5C,eAAM,SAAS,EAAC,0BAA0B,GAAG,EAC7C,eAAM,SAAS,EAAC,0BAA0B,GAAG,EAC7C,eAAM,SAAS,EAAC,0BAA0B,GAAG,IACtC,EACT,YAAG,IAAI,EAAC,kBAAkB,EAAC,SAAS,EAAC,yBAAyB,2BAAe,IACzE,EACL,QAAQ,IACJ,IACH,CACP,CAAA;AACH,CAAC"}
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 a {
299
+ .kywi-admin-sidebar .kywi-admin-logo-link {
295
300
  display: inline-flex;
296
301
  align-items: center;
297
- gap: var(--kywi-space-2);
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 a::before {
305
- content: "";
306
- width: 10px;
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
- .kywi-admin-shell .kywi-admin-login-dot {
471
- width: 10px;
472
- height: 10px;
473
- border-radius: var(--kywi-radius-pill);
474
- background: var(--kywi-accent);
475
- box-shadow: 0 0 0 3px var(--kywi-ring-color);
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
- font-weight: var(--kywi-weight-bold);
2643
- color: var(--kywi-text);
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":"AA8BA,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,2CA+F/D"}
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: [_jsxs("div", { className: "kywi-admin-login-brand", children: [_jsx("span", { "aria-hidden": "true", className: "kywi-admin-login-dot" }), _jsx("h1", { children: "Kywi Admin" })] }), _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
+ _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":"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"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/admin/surfaces/login.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kywi-software/core",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Kywi CMS core — schema generator, REST API, and admin UI for Next.js.",
5
5
  "type": "module",
6
6
  "license": "AGPL-3.0-only",