@cloudvoyant/helix 0.16.0 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +480 -2
- package/dist/index.d.cts +286 -1
- package/dist/index.d.ts +286 -1
- package/dist/index.js +398 -1
- package/package.json +12 -2
- package/src/theme.css +2 -2
package/dist/index.js
CHANGED
|
@@ -807,6 +807,314 @@ async function renderMermaidSource(code) {
|
|
|
807
807
|
const { svg } = await mermaid.render(`helix-mmd-${Date.now()}-${mermaidSeq++}`, code);
|
|
808
808
|
return svg;
|
|
809
809
|
}
|
|
810
|
+
|
|
811
|
+
// src/clipboard.ts
|
|
812
|
+
var clipboardTriggerBase = "inline-flex h-7 w-7 shrink-0 items-center justify-center gap-1.5 rounded-md text-xs text-muted-foreground transition-colors hover:bg-background hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring [&_svg]:size-3.5 [&_svg]:shrink-0";
|
|
813
|
+
|
|
814
|
+
// src/radio-group.ts
|
|
815
|
+
var radioGroupRootBase = "flex flex-col gap-2";
|
|
816
|
+
var radioGroupItemControlBase = "relative inline-flex size-4 shrink-0 items-center justify-center rounded-full border border-input bg-transparent shadow-xs transition-shadow focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/30 focus-visible:ring-offset-1 focus-visible:ring-offset-background data-invalid:border-destructive data-invalid:ring-[3px] data-invalid:ring-destructive/24 data-[state=checked]:border-primary data-[state=checked]:text-primary disabled:pointer-events-none disabled:opacity-50";
|
|
817
|
+
var radioGroupItemTextBase = "select-none text-sm font-medium leading-none";
|
|
818
|
+
|
|
819
|
+
// src/notice.ts
|
|
820
|
+
import { cva as cva16 } from "class-variance-authority";
|
|
821
|
+
var noticeVariants = cva16(
|
|
822
|
+
"not-prose relative my-4 grid w-full items-center gap-y-0.5 rounded-lg border px-3 py-2.5 text-sm grid-cols-[0_1fr] has-[>svg]:grid-cols-[calc(var(--spacing)*3)_1fr] has-[>svg]:gap-x-2.5 [&>svg]:size-4",
|
|
823
|
+
{
|
|
824
|
+
variants: {
|
|
825
|
+
variant: {
|
|
826
|
+
none: "bg-card text-card-foreground",
|
|
827
|
+
info: "border-info/30 bg-info/5 [&>svg]:text-info",
|
|
828
|
+
success: "border-success/30 bg-success/5 [&>svg]:text-success",
|
|
829
|
+
warning: "border-warn/30 bg-warn/5 [&>svg]:text-warn",
|
|
830
|
+
error: "border-danger/30 bg-danger/5 [&>svg]:text-danger"
|
|
831
|
+
}
|
|
832
|
+
},
|
|
833
|
+
defaultVariants: {
|
|
834
|
+
variant: "info"
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
);
|
|
838
|
+
var noticeTitleBase = "col-start-2 min-h-4 font-semibold tracking-tight";
|
|
839
|
+
var noticeDescriptionBase = "col-start-2 text-sm text-foreground [&_p]:leading-relaxed";
|
|
840
|
+
|
|
841
|
+
// src/figure.ts
|
|
842
|
+
var figureRootBase = "not-prose my-4 flex flex-col items-center";
|
|
843
|
+
var figureImageBase = "rounded-lg border border-border";
|
|
844
|
+
var figureCaptionBase = "mt-2 text-center text-sm text-muted-foreground";
|
|
845
|
+
|
|
846
|
+
// src/reveal.ts
|
|
847
|
+
var revealRootBase = "not-prose my-4 overflow-hidden rounded-lg border border-border bg-muted/40";
|
|
848
|
+
var revealTriggerBase = "flex w-full cursor-pointer items-center gap-2 px-3 py-2.5 text-sm font-semibold";
|
|
849
|
+
var revealChevronBase = "size-4 shrink-0 text-muted-foreground transition-transform duration-200 data-[state=open]:rotate-90";
|
|
850
|
+
var revealContentBase = "border-t border-border px-3 py-2.5 text-sm text-foreground";
|
|
851
|
+
|
|
852
|
+
// src/prevnext.ts
|
|
853
|
+
var prevNextRootBase = "not-prose mt-8 flex flex-col gap-3 border-t border-border pt-6 sm:flex-row sm:justify-between";
|
|
854
|
+
var prevNextLinkBase = "group flex min-w-0 flex-1 flex-col rounded-lg border border-border px-4 py-3 no-underline transition-colors hover:border-primary";
|
|
855
|
+
var prevNextLinkNextBase = "items-end text-right";
|
|
856
|
+
var prevNextDirectionBase = "text-xs font-medium text-muted-foreground";
|
|
857
|
+
var prevNextTitleBase = "truncate text-sm font-medium text-foreground transition-colors group-hover:text-primary";
|
|
858
|
+
var prevNextSpacerBase = "flex-1";
|
|
859
|
+
|
|
860
|
+
// src/latex.ts
|
|
861
|
+
import katex from "katex";
|
|
862
|
+
var latexRootBase = "not-prose";
|
|
863
|
+
var latexDisplayBase = "my-4 block w-full overflow-x-auto py-1";
|
|
864
|
+
var latexInlineBase = "inline-block align-middle";
|
|
865
|
+
var latexErrorBase = "font-mono text-sm text-destructive";
|
|
866
|
+
function toLaTeX(latex, opts) {
|
|
867
|
+
return katex.renderToString(latex, {
|
|
868
|
+
displayMode: opts?.displayMode ?? false,
|
|
869
|
+
throwOnError: false,
|
|
870
|
+
strict: false
|
|
871
|
+
});
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
// src/code-block.ts
|
|
875
|
+
var codeBlockRootBase = "not-prose my-4 overflow-hidden rounded-lg border";
|
|
876
|
+
var codeBlockHeaderBase = "flex h-10 items-center justify-between gap-2 border-b bg-muted/50 px-4";
|
|
877
|
+
var codeBlockHeaderInfoBase = "flex min-w-0 items-center gap-2 text-muted-foreground";
|
|
878
|
+
var codeBlockTitleBase = "min-w-0 truncate font-mono text-xs";
|
|
879
|
+
var codeBlockBodyBase = "hx-cb relative overflow-x-auto bg-background";
|
|
880
|
+
var codeBlockBodyScrollableBase = "overflow-y-auto";
|
|
881
|
+
var codeBlockContentBase = "text-sm [&>pre]:p-4 [&_.line]:leading-[1.7]";
|
|
882
|
+
var codeBlockLineNumbersBase = "cbln";
|
|
883
|
+
var codeBlockHighlightBase = "cbhl";
|
|
884
|
+
var codeBlockLoadingBase = "flex h-16 items-center justify-center";
|
|
885
|
+
var codeBlockSpinnerBase = "h-4 w-4 animate-spin rounded-full border-2 border-muted-foreground border-t-transparent";
|
|
886
|
+
var codeBlockCopyFloatBase = "absolute right-2 top-2";
|
|
887
|
+
var CODE_BLOCK_STYLES = `
|
|
888
|
+
.hx-cb pre.shiki{margin:0!important;border:0!important;border-radius:0!important;background:transparent!important}
|
|
889
|
+
.hx-cb pre.shiki code{border:0!important;border-radius:0!important;background:transparent!important;padding:0!important}
|
|
890
|
+
:root.dark .hx-cb .shiki,
|
|
891
|
+
:root.dark .hx-cb .shiki span{color:var(--shiki-dark)!important;font-style:var(--shiki-dark-font-style)!important;font-weight:var(--shiki-dark-font-weight)!important;text-decoration:var(--shiki-dark-text-decoration)!important}
|
|
892
|
+
.hx-cb .cbln code{counter-reset:line;counter-increment:line 0}
|
|
893
|
+
.hx-cb .cbln .line::before{content:counter(line);counter-increment:line;display:inline-block;min-width:1.5rem;padding-right:.75rem;margin-right:1rem;text-align:right;font-size:.75rem;line-height:1.7;user-select:none;color:color-mix(in srgb,var(--muted-foreground,#888) 55%,transparent)}
|
|
894
|
+
.hx-cb .cbhl .line-highlighted{display:block;background-color:oklch(0.828 0.189 84.429/.12);border-left:2px solid oklch(0.769 0.188 70.08);margin:0 -1rem;padding:0 1rem}
|
|
895
|
+
`;
|
|
896
|
+
function injectCodeBlockStyles() {
|
|
897
|
+
if (typeof document === "undefined") return;
|
|
898
|
+
if (document.getElementById("hx-code-block")) return;
|
|
899
|
+
const el = document.createElement("style");
|
|
900
|
+
el.id = "hx-code-block";
|
|
901
|
+
el.textContent = CODE_BLOCK_STYLES;
|
|
902
|
+
document.head.appendChild(el);
|
|
903
|
+
}
|
|
904
|
+
function escapeHtml(s) {
|
|
905
|
+
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
906
|
+
}
|
|
907
|
+
function plaintextFallback(code) {
|
|
908
|
+
const lines = code.split("\n").map((l) => `<span class="line">${escapeHtml(l)}</span>`).join("\n");
|
|
909
|
+
return `<pre class="shiki" tabindex="-1"><code>${lines}</code></pre>`;
|
|
910
|
+
}
|
|
911
|
+
async function renderCodeToHtml(code, language, highlightLines) {
|
|
912
|
+
injectCodeBlockStyles();
|
|
913
|
+
try {
|
|
914
|
+
const { codeToHtml } = await import("shiki/bundle/full");
|
|
915
|
+
return await codeToHtml(code, {
|
|
916
|
+
lang: language,
|
|
917
|
+
themes: { light: "github-light", dark: "github-dark" },
|
|
918
|
+
tabindex: false,
|
|
919
|
+
transformers: [
|
|
920
|
+
{
|
|
921
|
+
pre(node) {
|
|
922
|
+
if (node.properties?.["style"]) {
|
|
923
|
+
node.properties["style"] = node.properties["style"].replace(/background-color:\s*[^;]+;?\s*/gi, "").replace(/--shiki-dark-bg:\s*[^;]+;?\s*/gi, "");
|
|
924
|
+
}
|
|
925
|
+
},
|
|
926
|
+
line(node, line) {
|
|
927
|
+
if (highlightLines?.includes(line)) {
|
|
928
|
+
this.addClassToHast(node, "line-highlighted");
|
|
929
|
+
}
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
]
|
|
933
|
+
});
|
|
934
|
+
} catch {
|
|
935
|
+
return plaintextFallback(code);
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
|
|
939
|
+
// src/manim.ts
|
|
940
|
+
var manimRootBase = "not-prose my-4";
|
|
941
|
+
var manimContainerBase = "relative w-full overflow-hidden rounded-lg border border-border [&_canvas]:!h-auto [&_canvas]:!max-w-full";
|
|
942
|
+
var manimPlaceholderBase = "flex w-full items-center justify-center bg-muted/40";
|
|
943
|
+
var manimPlaceholderLabelBase = "text-sm text-muted-foreground";
|
|
944
|
+
var manimErrorBase = "flex items-center justify-center border-destructive/50 bg-destructive/5 p-6 text-sm text-destructive";
|
|
945
|
+
var manimCaptionBase = "mt-2 text-center text-sm text-muted-foreground";
|
|
946
|
+
|
|
947
|
+
// src/youtube.ts
|
|
948
|
+
var youtubeRootBase = "not-prose my-4";
|
|
949
|
+
var youtubeTitleBase = "mb-2 text-lg font-semibold text-foreground";
|
|
950
|
+
var youtubeFacadeBase = "group relative aspect-video w-full cursor-pointer overflow-hidden rounded-md border border-border bg-muted/40";
|
|
951
|
+
var youtubePlayButtonBase = "absolute inset-0 flex items-center justify-center";
|
|
952
|
+
var youtubePlayButtonInnerBase = "flex items-center justify-center rounded-xl bg-red-600 px-4 py-2 text-white shadow-lg transition-transform group-hover:scale-105";
|
|
953
|
+
var youtubeDescriptionBase = "mt-2 text-sm text-muted-foreground";
|
|
954
|
+
var youtubeChaptersBase = "group mt-3 rounded-lg border border-border bg-muted/40";
|
|
955
|
+
var youtubeChaptersSummaryBase = "flex cursor-pointer list-none items-center gap-2 px-3 py-2.5 text-sm font-medium [&::-webkit-details-marker]:hidden";
|
|
956
|
+
var youtubeChaptersChevronBase = "size-4 shrink-0 text-muted-foreground transition-transform duration-200 group-open:rotate-90";
|
|
957
|
+
var youtubeChaptersListBase = "border-t border-border px-2 py-2";
|
|
958
|
+
var youtubeChapterButtonBase = "inline-flex w-full items-center gap-2 rounded-md px-2 py-1 text-left text-sm transition-colors hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring";
|
|
959
|
+
var youtubeChapterTimeBase = "font-mono text-xs text-primary";
|
|
960
|
+
var youtubeChapterLabelBase = "text-foreground";
|
|
961
|
+
function extractYouTubeId(raw) {
|
|
962
|
+
try {
|
|
963
|
+
const url = new URL(raw);
|
|
964
|
+
const v = url.searchParams.get("v");
|
|
965
|
+
if (v) return v;
|
|
966
|
+
if (url.hostname === "youtu.be") return url.pathname.slice(1);
|
|
967
|
+
} catch {
|
|
968
|
+
}
|
|
969
|
+
return raw;
|
|
970
|
+
}
|
|
971
|
+
function formatTime(seconds) {
|
|
972
|
+
const h = Math.floor(seconds / 3600);
|
|
973
|
+
const m = Math.floor(seconds % 3600 / 60);
|
|
974
|
+
const s = Math.floor(seconds % 60);
|
|
975
|
+
const mm = String(m).padStart(2, "0");
|
|
976
|
+
const ss = String(s).padStart(2, "0");
|
|
977
|
+
return h > 0 ? `${h}:${mm}:${ss}` : `${mm}:${ss}`;
|
|
978
|
+
}
|
|
979
|
+
var TIMESTAMP_RE = /^\s*\[?\(?(?:(\d+):)?(\d{1,2}):(\d{2})\)?\]?\s+(\S.*)$/;
|
|
980
|
+
function parseYouTubeChapters(description) {
|
|
981
|
+
return description.split("\n").map((line) => {
|
|
982
|
+
const m = TIMESTAMP_RE.exec(line);
|
|
983
|
+
if (!m) return null;
|
|
984
|
+
const hours = m[1] ? Number(m[1]) : 0;
|
|
985
|
+
const t = hours * 3600 + Number(m[2]) * 60 + Number(m[3]);
|
|
986
|
+
return { t, label: m[4] };
|
|
987
|
+
}).filter((c) => c !== null);
|
|
988
|
+
}
|
|
989
|
+
async function fetchYouTubeMetadata(url) {
|
|
990
|
+
const videoId = extractYouTubeId(url);
|
|
991
|
+
const res = await fetch(
|
|
992
|
+
`https://noembed.com/embed?url=${encodeURIComponent(`https://www.youtube.com/watch?v=${videoId}`)}`
|
|
993
|
+
);
|
|
994
|
+
if (!res.ok) return {};
|
|
995
|
+
const data = await res.json();
|
|
996
|
+
return { title: data.title, description: data.description };
|
|
997
|
+
}
|
|
998
|
+
|
|
999
|
+
// src/chart.ts
|
|
1000
|
+
import {
|
|
1001
|
+
barY,
|
|
1002
|
+
areaY,
|
|
1003
|
+
colorLegend,
|
|
1004
|
+
defineChart,
|
|
1005
|
+
lineY,
|
|
1006
|
+
createChartRuntime,
|
|
1007
|
+
renderChartSvg
|
|
1008
|
+
} from "@tanstack/charts";
|
|
1009
|
+
import { pie, polar, radialArc } from "@tanstack/charts/polar";
|
|
1010
|
+
import { scaleLinear } from "@tanstack/charts/scales/linear";
|
|
1011
|
+
import { scaleOrdinal } from "@tanstack/charts/scales/ordinal";
|
|
1012
|
+
import { scalePoint } from "@tanstack/charts/scales/point";
|
|
1013
|
+
import { tooltip } from "@tanstack/charts/tooltip";
|
|
1014
|
+
var chartRootBase = "not-prose my-4";
|
|
1015
|
+
var chartPlaceholderBase = "flex items-center justify-center rounded-md border border-border bg-muted/40";
|
|
1016
|
+
var chartPlaceholderLabelBase = "text-sm text-muted-foreground";
|
|
1017
|
+
function defaultChartColor(index) {
|
|
1018
|
+
return `var(--chart-${index % 5 + 1})`;
|
|
1019
|
+
}
|
|
1020
|
+
var COLOR_TOKENS = ["var(--chart-1)", "var(--chart-2)", "var(--chart-3)", "var(--chart-4)", "var(--chart-5)"];
|
|
1021
|
+
function buildChartDefinition(props) {
|
|
1022
|
+
const {
|
|
1023
|
+
type,
|
|
1024
|
+
data,
|
|
1025
|
+
series,
|
|
1026
|
+
xKey = "name",
|
|
1027
|
+
nameKey = "name",
|
|
1028
|
+
showLegend = true,
|
|
1029
|
+
showGrid = true,
|
|
1030
|
+
showAxis = true
|
|
1031
|
+
} = props;
|
|
1032
|
+
const colors = series.map((s, i) => s.color ?? COLOR_TOKENS[i % COLOR_TOKENS.length]);
|
|
1033
|
+
if (type === "pie") {
|
|
1034
|
+
const valueKey = series[0]?.key ?? "value";
|
|
1035
|
+
const slices = pie(data, { value: valueKey });
|
|
1036
|
+
const pieColors = data.map((_, i) => series[0]?.color ?? COLOR_TOKENS[i % COLOR_TOKENS.length]);
|
|
1037
|
+
const spec2 = {
|
|
1038
|
+
marks: [
|
|
1039
|
+
polar({
|
|
1040
|
+
scales: { angle: null, radius: null },
|
|
1041
|
+
radiusRatio: 0.82,
|
|
1042
|
+
marks: [radialArc(slices, { color: nameKey, key: nameKey, cornerRadius: 3 })]
|
|
1043
|
+
})
|
|
1044
|
+
],
|
|
1045
|
+
scales: { x: null, y: null },
|
|
1046
|
+
color: {
|
|
1047
|
+
domain: data.map((d) => String(d[nameKey])),
|
|
1048
|
+
range: pieColors,
|
|
1049
|
+
legend: showLegend ? colorLegend({}) : void 0
|
|
1050
|
+
},
|
|
1051
|
+
tooltip
|
|
1052
|
+
};
|
|
1053
|
+
return defineChart(spec2);
|
|
1054
|
+
}
|
|
1055
|
+
const rows = data.flatMap(
|
|
1056
|
+
(row) => series.map((s) => ({
|
|
1057
|
+
...row,
|
|
1058
|
+
_series: s.label ?? s.key,
|
|
1059
|
+
_value: Number(row[s.key])
|
|
1060
|
+
}))
|
|
1061
|
+
);
|
|
1062
|
+
const markOpts = { x: xKey, y: "_value", z: "_series" };
|
|
1063
|
+
const mark = type === "bar" ? barY(rows, { ...markOpts, fillOpacity: 0.85 }) : type === "area" ? areaY(rows, { ...markOpts, fillOpacity: 0.15 }) : lineY(rows, { ...markOpts, strokeWidth: 2 });
|
|
1064
|
+
const spec = {
|
|
1065
|
+
marks: [mark],
|
|
1066
|
+
scales: {
|
|
1067
|
+
x: { scale: () => scalePoint().padding(0.4), axis: showAxis ? {} : void 0 },
|
|
1068
|
+
y: {
|
|
1069
|
+
scale: scaleLinear,
|
|
1070
|
+
nice: true,
|
|
1071
|
+
grid: showGrid,
|
|
1072
|
+
axis: showAxis ? { ticks: { count: 5 } } : void 0
|
|
1073
|
+
}
|
|
1074
|
+
},
|
|
1075
|
+
color: {
|
|
1076
|
+
scale: () => scaleOrdinal().range(colors),
|
|
1077
|
+
domain: series.map((s) => s.label ?? s.key),
|
|
1078
|
+
legend: showLegend ? colorLegend({}) : void 0
|
|
1079
|
+
},
|
|
1080
|
+
tooltip
|
|
1081
|
+
};
|
|
1082
|
+
return defineChart(spec);
|
|
1083
|
+
}
|
|
1084
|
+
function renderChartSvgString(props, opts = {}) {
|
|
1085
|
+
const { width = 720, height = props.height ?? 400, ariaLabel = "Chart" } = opts;
|
|
1086
|
+
const definition = buildChartDefinition(props);
|
|
1087
|
+
const runtime = createChartRuntime();
|
|
1088
|
+
try {
|
|
1089
|
+
const scene = runtime.render(definition, { width, height });
|
|
1090
|
+
return renderChartSvg(scene, { ariaLabel, idPrefix: "hx-chart" });
|
|
1091
|
+
} finally {
|
|
1092
|
+
runtime.destroy();
|
|
1093
|
+
}
|
|
1094
|
+
}
|
|
1095
|
+
|
|
1096
|
+
// src/question.ts
|
|
1097
|
+
var questionCardBase = "not-prose my-4 rounded-lg border border-border bg-card p-4";
|
|
1098
|
+
var questionPromptBase = "mb-3 text-sm font-medium text-foreground";
|
|
1099
|
+
var questionGroupBase = "grid gap-2";
|
|
1100
|
+
var questionOptionBase = "rounded-md px-3 py-2 transition-colors hover:bg-muted/60";
|
|
1101
|
+
var questionOptionCorrectBase = "bg-success/10";
|
|
1102
|
+
var questionOptionIncorrectBase = "bg-destructive/10";
|
|
1103
|
+
var questionCheckButtonBase = "mt-3 rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50";
|
|
1104
|
+
var questionInputBase = "h-9 w-32 rounded-md border border-input bg-background px-3 text-sm text-foreground focus-visible:border-ring focus-visible:ring-2 focus-visible:ring-ring/50 focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50";
|
|
1105
|
+
var questionUnitBase = "text-sm text-muted-foreground";
|
|
1106
|
+
var feedbackCorrectBase = "text-success";
|
|
1107
|
+
var feedbackIncorrectBase = "text-destructive";
|
|
1108
|
+
var feedbackExplanationBase = "mt-1.5 text-sm text-muted-foreground";
|
|
1109
|
+
var quizRootBase = "not-prose my-6 rounded-lg border border-border bg-card/50 p-4";
|
|
1110
|
+
var quizHeaderBase = "mb-4 flex items-center justify-between gap-3";
|
|
1111
|
+
var quizTitleBase = "text-base font-semibold text-foreground";
|
|
1112
|
+
var quizScoreBase = "inline-flex items-center rounded-full bg-muted px-2.5 py-0.5 text-xs font-medium text-muted-foreground";
|
|
1113
|
+
var quizResultBase = "mt-4 rounded-lg border border-border bg-muted/40 p-4";
|
|
1114
|
+
var quizResultTitleBase = "text-lg font-semibold text-foreground";
|
|
1115
|
+
var quizResultTextBase = "mt-1 text-sm text-muted-foreground";
|
|
1116
|
+
var quizSubmitButtonBase = "rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50";
|
|
1117
|
+
var quizResetButtonBase = "inline-flex items-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-sm font-medium text-foreground transition-colors hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2";
|
|
810
1118
|
export {
|
|
811
1119
|
SIDEBAR_KEYBOARD_SHORTCUT,
|
|
812
1120
|
SIDEBAR_WIDTH,
|
|
@@ -815,6 +1123,7 @@ export {
|
|
|
815
1123
|
THEMES,
|
|
816
1124
|
THEME_NAMES,
|
|
817
1125
|
badgeVariants,
|
|
1126
|
+
buildChartDefinition,
|
|
818
1127
|
buttonVariants,
|
|
819
1128
|
cardBodyBase,
|
|
820
1129
|
cardCoverVariants,
|
|
@@ -824,11 +1133,27 @@ export {
|
|
|
824
1133
|
cardTitleBase,
|
|
825
1134
|
cardVariants,
|
|
826
1135
|
centerBase,
|
|
1136
|
+
chartPlaceholderBase,
|
|
1137
|
+
chartPlaceholderLabelBase,
|
|
1138
|
+
chartRootBase,
|
|
827
1139
|
checkboxGroupBase,
|
|
828
1140
|
checkboxIndicatorBase,
|
|
829
1141
|
checkboxLabelBase,
|
|
830
1142
|
checkboxVariants,
|
|
1143
|
+
clipboardTriggerBase,
|
|
831
1144
|
cn,
|
|
1145
|
+
codeBlockBodyBase,
|
|
1146
|
+
codeBlockBodyScrollableBase,
|
|
1147
|
+
codeBlockContentBase,
|
|
1148
|
+
codeBlockCopyFloatBase,
|
|
1149
|
+
codeBlockHeaderBase,
|
|
1150
|
+
codeBlockHeaderInfoBase,
|
|
1151
|
+
codeBlockHighlightBase,
|
|
1152
|
+
codeBlockLineNumbersBase,
|
|
1153
|
+
codeBlockLoadingBase,
|
|
1154
|
+
codeBlockRootBase,
|
|
1155
|
+
codeBlockSpinnerBase,
|
|
1156
|
+
codeBlockTitleBase,
|
|
832
1157
|
colBase,
|
|
833
1158
|
comboboxClearTriggerBase,
|
|
834
1159
|
comboboxContentBase,
|
|
@@ -842,6 +1167,7 @@ export {
|
|
|
842
1167
|
comboboxPositionerBase,
|
|
843
1168
|
comboboxTriggerBase,
|
|
844
1169
|
containerBase,
|
|
1170
|
+
defaultChartColor,
|
|
845
1171
|
dialogBackdropBase,
|
|
846
1172
|
dialogCloseTriggerBase,
|
|
847
1173
|
dialogContentBase,
|
|
@@ -853,6 +1179,11 @@ export {
|
|
|
853
1179
|
dialogHeaderStickyBase,
|
|
854
1180
|
dialogPositionerBase,
|
|
855
1181
|
dialogTitleBase,
|
|
1182
|
+
extractYouTubeId,
|
|
1183
|
+
feedbackCorrectBase,
|
|
1184
|
+
feedbackExplanationBase,
|
|
1185
|
+
feedbackIncorrectBase,
|
|
1186
|
+
fetchYouTubeMetadata,
|
|
856
1187
|
fieldErrorBase,
|
|
857
1188
|
fieldHelperBase,
|
|
858
1189
|
fieldLabelBase,
|
|
@@ -862,9 +1193,24 @@ export {
|
|
|
862
1193
|
fieldsetHelperBase,
|
|
863
1194
|
fieldsetLegendBase,
|
|
864
1195
|
fieldsetRootBase,
|
|
1196
|
+
figureCaptionBase,
|
|
1197
|
+
figureImageBase,
|
|
1198
|
+
figureRootBase,
|
|
1199
|
+
formatTime,
|
|
865
1200
|
hstackBase,
|
|
1201
|
+
injectCodeBlockStyles,
|
|
866
1202
|
inputVariants,
|
|
867
1203
|
itemVariants,
|
|
1204
|
+
latexDisplayBase,
|
|
1205
|
+
latexErrorBase,
|
|
1206
|
+
latexInlineBase,
|
|
1207
|
+
latexRootBase,
|
|
1208
|
+
manimCaptionBase,
|
|
1209
|
+
manimContainerBase,
|
|
1210
|
+
manimErrorBase,
|
|
1211
|
+
manimPlaceholderBase,
|
|
1212
|
+
manimPlaceholderLabelBase,
|
|
1213
|
+
manimRootBase,
|
|
868
1214
|
mermaidLoadingBase,
|
|
869
1215
|
mermaidRootBase,
|
|
870
1216
|
mermaidSourceBase,
|
|
@@ -899,6 +1245,9 @@ export {
|
|
|
899
1245
|
navbarShrunkBase,
|
|
900
1246
|
navbarTriggerVariants,
|
|
901
1247
|
navbarVariants,
|
|
1248
|
+
noticeDescriptionBase,
|
|
1249
|
+
noticeTitleBase,
|
|
1250
|
+
noticeVariants,
|
|
902
1251
|
numberInputControlBase,
|
|
903
1252
|
numberInputInputBase,
|
|
904
1253
|
numberInputRootBase,
|
|
@@ -914,6 +1263,7 @@ export {
|
|
|
914
1263
|
paginationItemBase,
|
|
915
1264
|
paginationRootBase,
|
|
916
1265
|
paginationTriggerBase,
|
|
1266
|
+
parseYouTubeChapters,
|
|
917
1267
|
popoverArrowBase,
|
|
918
1268
|
popoverCloseTriggerBase,
|
|
919
1269
|
popoverContentBase,
|
|
@@ -921,8 +1271,41 @@ export {
|
|
|
921
1271
|
popoverIndicatorBase,
|
|
922
1272
|
popoverPositionerBase,
|
|
923
1273
|
popoverTitleBase,
|
|
1274
|
+
prevNextDirectionBase,
|
|
1275
|
+
prevNextLinkBase,
|
|
1276
|
+
prevNextLinkNextBase,
|
|
1277
|
+
prevNextRootBase,
|
|
1278
|
+
prevNextSpacerBase,
|
|
1279
|
+
prevNextTitleBase,
|
|
1280
|
+
questionCardBase,
|
|
1281
|
+
questionCheckButtonBase,
|
|
1282
|
+
questionGroupBase,
|
|
1283
|
+
questionInputBase,
|
|
1284
|
+
questionOptionBase,
|
|
1285
|
+
questionOptionCorrectBase,
|
|
1286
|
+
questionOptionIncorrectBase,
|
|
1287
|
+
questionPromptBase,
|
|
1288
|
+
questionUnitBase,
|
|
1289
|
+
quizHeaderBase,
|
|
1290
|
+
quizResetButtonBase,
|
|
1291
|
+
quizResultBase,
|
|
1292
|
+
quizResultTextBase,
|
|
1293
|
+
quizResultTitleBase,
|
|
1294
|
+
quizRootBase,
|
|
1295
|
+
quizScoreBase,
|
|
1296
|
+
quizSubmitButtonBase,
|
|
1297
|
+
quizTitleBase,
|
|
1298
|
+
radioGroupItemControlBase,
|
|
1299
|
+
radioGroupItemTextBase,
|
|
1300
|
+
radioGroupRootBase,
|
|
1301
|
+
renderChartSvgString,
|
|
1302
|
+
renderCodeToHtml,
|
|
924
1303
|
renderMermaidSource,
|
|
925
1304
|
resolveMermaidThemeVariables,
|
|
1305
|
+
revealChevronBase,
|
|
1306
|
+
revealContentBase,
|
|
1307
|
+
revealRootBase,
|
|
1308
|
+
revealTriggerBase,
|
|
926
1309
|
rowBase,
|
|
927
1310
|
scrollContentBase,
|
|
928
1311
|
scrollCornerBase,
|
|
@@ -968,6 +1351,7 @@ export {
|
|
|
968
1351
|
tagsInputItemTextBase,
|
|
969
1352
|
tagsInputRootBase,
|
|
970
1353
|
textareaBase,
|
|
1354
|
+
toLaTeX,
|
|
971
1355
|
toggleButtonVariants,
|
|
972
1356
|
tooltipArrowBase,
|
|
973
1357
|
tooltipContentBase,
|
|
@@ -982,5 +1366,18 @@ export {
|
|
|
982
1366
|
windowPositionerBase,
|
|
983
1367
|
windowResizeTriggerBase,
|
|
984
1368
|
windowStageTriggerBase,
|
|
985
|
-
windowTitleBase
|
|
1369
|
+
windowTitleBase,
|
|
1370
|
+
youtubeChapterButtonBase,
|
|
1371
|
+
youtubeChapterLabelBase,
|
|
1372
|
+
youtubeChapterTimeBase,
|
|
1373
|
+
youtubeChaptersBase,
|
|
1374
|
+
youtubeChaptersChevronBase,
|
|
1375
|
+
youtubeChaptersListBase,
|
|
1376
|
+
youtubeChaptersSummaryBase,
|
|
1377
|
+
youtubeDescriptionBase,
|
|
1378
|
+
youtubeFacadeBase,
|
|
1379
|
+
youtubePlayButtonBase,
|
|
1380
|
+
youtubePlayButtonInnerBase,
|
|
1381
|
+
youtubeRootBase,
|
|
1382
|
+
youtubeTitleBase
|
|
986
1383
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudvoyant/helix",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.0",
|
|
4
4
|
"description": "helix shared component interfaces, cva variants, and theme",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -29,21 +29,31 @@
|
|
|
29
29
|
"access": "public"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
+
"@tanstack/charts": "^0.16.0",
|
|
32
33
|
"class-variance-authority": "^0.7.1",
|
|
33
34
|
"clsx": "^2.1.1",
|
|
35
|
+
"katex": "^0.16.11",
|
|
34
36
|
"tailwind-merge": "^3.6.0"
|
|
35
37
|
},
|
|
36
38
|
"peerDependencies": {
|
|
37
|
-
"mermaid": "^11.16.0"
|
|
39
|
+
"mermaid": "^11.16.0",
|
|
40
|
+
"shiki": "^3.0.0"
|
|
38
41
|
},
|
|
39
42
|
"peerDependenciesMeta": {
|
|
40
43
|
"mermaid": {
|
|
41
44
|
"optional": true
|
|
45
|
+
},
|
|
46
|
+
"shiki": {
|
|
47
|
+
"optional": true
|
|
42
48
|
}
|
|
43
49
|
},
|
|
44
50
|
"devDependencies": {
|
|
51
|
+
"@types/katex": "^0.16.8",
|
|
45
52
|
"@types/node": "^22.0.0",
|
|
53
|
+
"katex": "^0.16.11",
|
|
54
|
+
"manim-web": "^0.3.24",
|
|
46
55
|
"mermaid": "^11.16.0",
|
|
56
|
+
"shiki": "^3.0.0",
|
|
47
57
|
"vitest": "^2.0.0"
|
|
48
58
|
},
|
|
49
59
|
"scripts": {
|
package/src/theme.css
CHANGED
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
--success-foreground: oklch(0.985 0 0);
|
|
79
79
|
--danger: oklch(0.577 0.245 27.325);
|
|
80
80
|
--danger-foreground: oklch(0.985 0 0);
|
|
81
|
-
--warn: oklch(0.
|
|
81
|
+
--warn: oklch(0.65 0.17 70);
|
|
82
82
|
--warn-foreground: oklch(0.2 0.04 95);
|
|
83
83
|
--info: oklch(0.55 0.22 256);
|
|
84
84
|
--info-foreground: oklch(0.985 0 0);
|
|
@@ -128,7 +128,7 @@
|
|
|
128
128
|
--success-foreground: oklch(0.12 0.02 149);
|
|
129
129
|
--danger: oklch(0.704 0.191 22.216);
|
|
130
130
|
--danger-foreground: oklch(0.985 0 0);
|
|
131
|
-
--warn: oklch(0.
|
|
131
|
+
--warn: oklch(0.72 0.15 70);
|
|
132
132
|
--warn-foreground: oklch(0.15 0.03 95);
|
|
133
133
|
--info: oklch(0.62 0.22 256);
|
|
134
134
|
--info-foreground: oklch(0.12 0.03 256);
|