@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.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, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
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.16.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.85 0.15 95);
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.78 0.13 95);
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);