@burdenoff/microfe-technospam 2026.1101.2 → 2026.1101.4

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.
Files changed (26) hide show
  1. package/dist/stories/journeys/Courses.stories.d.ts +5 -0
  2. package/dist/stories/journeys/Courses.stories.d.ts.map +1 -1
  3. package/dist/stories/journeys/Mentorship.stories.d.ts +5 -0
  4. package/dist/stories/journeys/Mentorship.stories.d.ts.map +1 -1
  5. package/dist/stories/journeys/Problems.stories.d.ts +5 -0
  6. package/dist/stories/journeys/Problems.stories.d.ts.map +1 -1
  7. package/dist/technospam/components/CardOpenButton.d.ts +26 -0
  8. package/dist/technospam/components/CardOpenButton.d.ts.map +1 -0
  9. package/dist/technospam/components/CardOpenButton.js +15 -0
  10. package/dist/technospam/components/CardOpenButton.js.map +1 -0
  11. package/dist/technospam/components/index.d.ts +1 -0
  12. package/dist/technospam/components/index.d.ts.map +1 -1
  13. package/dist/technospam/components/index.js +1 -0
  14. package/dist/technospam/pages/ApplicationsProblemsPagePage.d.ts.map +1 -1
  15. package/dist/technospam/pages/ApplicationsProblemsPagePage.js +80 -77
  16. package/dist/technospam/pages/ApplicationsProblemsPagePage.js.map +1 -1
  17. package/dist/technospam/pages/CoursesCoursesPagePage.d.ts.map +1 -1
  18. package/dist/technospam/pages/CoursesCoursesPagePage.js +68 -65
  19. package/dist/technospam/pages/CoursesCoursesPagePage.js.map +1 -1
  20. package/dist/technospam/pages/HackathonsHackathonsPagePage.d.ts.map +1 -1
  21. package/dist/technospam/pages/HackathonsHackathonsPagePage.js +75 -72
  22. package/dist/technospam/pages/HackathonsHackathonsPagePage.js.map +1 -1
  23. package/dist/technospam/pages/MentorshipMentorsPagePage.d.ts.map +1 -1
  24. package/dist/technospam/pages/MentorshipMentorsPagePage.js +1 -0
  25. package/dist/technospam/pages/MentorshipMentorsPagePage.js.map +1 -1
  26. package/package.json +1 -1
@@ -11,6 +11,11 @@ export declare const DiscoverAndEnroll: Story;
11
11
  * the lesson player, completes it, and moves on to the following lesson.
12
12
  */
13
13
  export declare const ContinueIntoLessonPlayer: Story;
14
+ /**
15
+ * BOFF-3157: a keyboard-only learner reaches a course card by its title button
16
+ * and opens it with Enter (the card used to be a click-only <div>).
17
+ */
18
+ export declare const OpenCourseWithKeyboard: Story;
14
19
  /** Level tabs narrow the catalog server-side. */
15
20
  export declare const FilterByLevel: Story;
16
21
  export declare const EmptyCatalog: Story;
@@ -1 +1 @@
1
- {"version":3,"file":"Courses.stories.d.ts","sourceRoot":"","sources":["../../../src/stories/journeys/Courses.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAGpE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,kBAAkB,CAMzC,CAAC;AACF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,6DAA6D;AAC7D,eAAO,MAAM,iBAAiB,EAAE,KAqB/B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,KAwBtC,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,aAAa,EAAE,KAW3B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAO1B,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,kBAAkB,EAAE,KAMhC,CAAC"}
1
+ {"version":3,"file":"Courses.stories.d.ts","sourceRoot":"","sources":["../../../src/stories/journeys/Courses.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAGpE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,kBAAkB,CAMzC,CAAC;AACF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,6DAA6D;AAC7D,eAAO,MAAM,iBAAiB,EAAE,KAqB/B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,KAwBtC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,KAYpC,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,aAAa,EAAE,KAW3B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAO1B,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,kBAAkB,EAAE,KAMhC,CAAC"}
@@ -6,5 +6,10 @@ export default meta;
6
6
  type Story = StoryObj<typeof meta>;
7
7
  /** Browse mentors and open a mentor's profile. */
8
8
  export declare const FindAMentor: Story;
9
+ /**
10
+ * BOFF-3157: a keyboard-only learner opens a mentor's profile from the card's
11
+ * "View profile" button with Enter (the card body itself is a pointer shortcut).
12
+ */
13
+ export declare const OpenMentorWithKeyboard: Story;
9
14
  export declare const BackendUnavailable: Story;
10
15
  //# sourceMappingURL=Mentorship.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Mentorship.stories.d.ts","sourceRoot":"","sources":["../../../src/stories/journeys/Mentorship.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAGpE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,kBAAkB,CAMzC,CAAC;AACF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,kDAAkD;AAClD,eAAO,MAAM,WAAW,EAAE,KAYzB,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAMhC,CAAC"}
1
+ {"version":3,"file":"Mentorship.stories.d.ts","sourceRoot":"","sources":["../../../src/stories/journeys/Mentorship.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAGpE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,kBAAkB,CAMzC,CAAC;AACF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,kDAAkD;AAClD,eAAO,MAAM,WAAW,EAAE,KAYzB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,KAepC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAMhC,CAAC"}
@@ -6,5 +6,10 @@ export default meta;
6
6
  type Story = StoryObj<typeof meta>;
7
7
  /** Pick a problem from the practice list, submit a solution, see the verdict. */
8
8
  export declare const PracticeAndSubmit: Story;
9
+ /**
10
+ * BOFF-3157: in the card layout a keyboard-only learner Tabs to a problem card
11
+ * (its title is the card's button) and opens it with Enter.
12
+ */
13
+ export declare const OpenProblemCardWithKeyboard: Story;
9
14
  export declare const BackendUnavailable: Story;
10
15
  //# sourceMappingURL=Problems.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Problems.stories.d.ts","sourceRoot":"","sources":["../../../src/stories/journeys/Problems.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAGpE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,kBAAkB,CAMzC,CAAC;AACF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,iFAAiF;AACjF,eAAO,MAAM,iBAAiB,EAAE,KA8B/B,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAMhC,CAAC"}
1
+ {"version":3,"file":"Problems.stories.d.ts","sourceRoot":"","sources":["../../../src/stories/journeys/Problems.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAIpE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,kBAAkB,CAMzC,CAAC;AACF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,iFAAiF;AACjF,eAAO,MAAM,iBAAiB,EAAE,KA8B/B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,2BAA2B,EAAE,KAoBzC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAMhC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { ReactNode } from 'react';
2
+
3
+ /**
4
+ * The keyboard-reachable control of a clickable card (a "stretched" button).
5
+ *
6
+ * Course and hackathon cards used to open their details page from an
7
+ * `onClick` on the card's `<div>`, which a keyboard or screen-reader user can
8
+ * neither reach nor activate (WCAG 2.1.1 Keyboard, 4.1.2 Name, Role, Value;
9
+ * found by the BOFF-3157 keyboard walkthrough). Render the card title through
10
+ * this button instead and drop the card's own `onClick`:
11
+ *
12
+ * - the button is the card's single Tab stop, named by the title;
13
+ * - its `::after` covers the whole card (the card must be positioned, which
14
+ * `GlassCard` is), so a click anywhere on the card still opens it;
15
+ * - the focus ring is drawn inset on that overlay, so it outlines the whole
16
+ * card and is not clipped by the card's `overflow-hidden`.
17
+ *
18
+ * Keep other interactive elements out of a card that uses this, or lift them
19
+ * above the overlay with `relative z-20`.
20
+ */
21
+ export declare function CardOpenButton({ onOpen, children, className, }: {
22
+ onOpen: () => void;
23
+ children: ReactNode;
24
+ className?: string;
25
+ }): import("react").JSX.Element;
26
+ //# sourceMappingURL=CardOpenButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CardOpenButton.d.ts","sourceRoot":"","sources":["../../../src/technospam/components/CardOpenButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,QAAQ,EACR,SAAS,GACV,EAAE;IACD,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,+BAeA"}
@@ -0,0 +1,15 @@
1
+ import { cn as e } from "../utils/cn.js";
2
+ import { jsx as t } from "react/jsx-runtime";
3
+ //#region src/technospam/components/CardOpenButton.tsx
4
+ function n({ onOpen: n, children: r, className: i }) {
5
+ return /* @__PURE__ */ t("button", {
6
+ type: "button",
7
+ onClick: n,
8
+ className: e("max-w-full truncate text-left focus-visible:outline-none", "after:absolute after:inset-0 after:z-10 after:rounded-card after:content-['']", "focus-visible:after:ring-2 focus-visible:after:ring-inset focus-visible:after:ring-[var(--color-focus-ring)]", i),
9
+ children: r
10
+ });
11
+ }
12
+ //#endregion
13
+ export { n as CardOpenButton };
14
+
15
+ //# sourceMappingURL=CardOpenButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CardOpenButton.js","names":[],"sources":["../../../src/technospam/components/CardOpenButton.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { cn } from '../utils/cn';\n\n/**\n * The keyboard-reachable control of a clickable card (a \"stretched\" button).\n *\n * Course and hackathon cards used to open their details page from an\n * `onClick` on the card's `<div>`, which a keyboard or screen-reader user can\n * neither reach nor activate (WCAG 2.1.1 Keyboard, 4.1.2 Name, Role, Value;\n * found by the BOFF-3157 keyboard walkthrough). Render the card title through\n * this button instead and drop the card's own `onClick`:\n *\n * - the button is the card's single Tab stop, named by the title;\n * - its `::after` covers the whole card (the card must be positioned, which\n * `GlassCard` is), so a click anywhere on the card still opens it;\n * - the focus ring is drawn inset on that overlay, so it outlines the whole\n * card and is not clipped by the card's `overflow-hidden`.\n *\n * Keep other interactive elements out of a card that uses this, or lift them\n * above the overlay with `relative z-20`.\n */\nexport function CardOpenButton({\n onOpen,\n children,\n className,\n}: {\n onOpen: () => void;\n children: ReactNode;\n className?: string;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onOpen}\n className={cn(\n 'max-w-full truncate text-left focus-visible:outline-none',\n \"after:absolute after:inset-0 after:z-10 after:rounded-card after:content-['']\",\n 'focus-visible:after:ring-2 focus-visible:after:ring-inset focus-visible:after:ring-[var(--color-focus-ring)]',\n className\n )}\n >\n {children}\n </button>\n );\n}\n"],"mappings":";;;AAsBA,SAAgB,EAAe,EAC7B,WACA,aACA,gBAKC;AACD,QACE,kBAAC,UAAD;EACE,MAAK;EACL,SAAS;EACT,WAAW,EACT,4DACA,iFACA,gHACA,EACD;EAEA;EACM,CAAA"}
@@ -11,4 +11,5 @@ export { UpgradeGate, PremiumBadge } from './UpgradeGate';
11
11
  export { CodePanel, IoBlock, TestResultsPanel } from './SubmissionViews';
12
12
  export { SubmissionReviewPanel } from './SubmissionReviewPanel';
13
13
  export { TechnoSpamErrorBoundary } from './TechnoSpamErrorBoundary';
14
+ export { CardOpenButton } from './CardOpenButton';
14
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/technospam/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/technospam/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
@@ -11,3 +11,4 @@ import "./TagInput.js";
11
11
  import "./SubmissionViews.js";
12
12
  import "./SubmissionReviewPanel.js";
13
13
  import "./TechnoSpamErrorBoundary.js";
14
+ import "./CardOpenButton.js";
@@ -1 +1 @@
1
- {"version":3,"file":"ApplicationsProblemsPagePage.d.ts","sourceRoot":"","sources":["../../../src/technospam/pages/ApplicationsProblemsPagePage.tsx"],"names":[],"mappings":"AA2JA,wBAAgB,4BAA4B,gCAuT3C"}
1
+ {"version":3,"file":"ApplicationsProblemsPagePage.d.ts","sourceRoot":"","sources":["../../../src/technospam/pages/ApplicationsProblemsPagePage.tsx"],"names":[],"mappings":"AAyJA,wBAAgB,4BAA4B,gCAuT3C"}
@@ -5,31 +5,31 @@ import { PageLayout as i } from "../components/PageLayout.js";
5
5
  import { StatCard as a } from "../components/StatCard.js";
6
6
  import { MediaCover as o, topicIcon as s } from "../components/MediaCover.js";
7
7
  import { StatusBadge as c } from "../components/StatusBadge.js";
8
- import { readProblemCatalogView as l, safeLocalStorage as u, writeProblemCatalogView as ee } from "../utils/problemCatalog.js";
9
- import { PremiumBadge as d } from "../components/UpgradeGate.js";
10
- import { ProblemsTable as f } from "../components/ProblemsTable.js";
8
+ import { readProblemCatalogView as l, safeLocalStorage as u, writeProblemCatalogView as d } from "../utils/problemCatalog.js";
9
+ import { PremiumBadge as f } from "../components/UpgradeGate.js";
10
+ import { ProblemsTable as ee } from "../components/ProblemsTable.js";
11
11
  import { LoadMore as te } from "../components/LoadMore.js";
12
- import { EmptyView as p, ErrorView as m, LoadingGrid as ne } from "../components/StateViews.js";
13
- import { pageArg as re, usePageLimit as ie, useProblemsQuery as h, useSolvedProblemIds as ae } from "../api/technospamApi.js";
12
+ import { EmptyView as ne, ErrorView as re, LoadingGrid as p } from "../components/StateViews.js";
13
+ import { pageArg as ie, usePageLimit as ae, useProblemsQuery as oe, useSolvedProblemIds as se } from "../api/technospamApi.js";
14
+ import { CardOpenButton as m } from "../components/CardOpenButton.js";
14
15
  import "../components/index.js";
15
- import { TAB_PANEL_FOCUS_CLASS as oe } from "../lib/a11y.js";
16
- import { useCallback as g, useMemo as _, useState as v } from "react";
17
- import { Building2 as y, CheckCircle2 as b, Code2 as x, Flame as S, Gauge as se, Layers as C, LayoutGrid as w, List as ce, Search as le, Tag as T, Trophy as E } from "lucide-react";
16
+ import { TAB_PANEL_FOCUS_CLASS as ce } from "../lib/a11y.js";
17
+ import { useCallback as h, useMemo as g, useState as _ } from "react";
18
+ import { Building2 as v, CheckCircle2 as y, Code2 as b, Flame as x, Gauge as S, Layers as C, LayoutGrid as le, List as ue, Search as w, Tag as T, Trophy as E } from "lucide-react";
18
19
  import { jsx as D, jsxs as O } from "react/jsx-runtime";
19
- import { Badge as k, Button as A, GlassCard as j, Input as ue, Select as M, SelectContent as N, SelectItem as P, SelectTrigger as F, SelectValue as I, Tabs as L, TabsContent as R, TabsList as z, TabsTrigger as B } from "@burdenoff/fe-libs/ui";
20
+ import { Badge as k, Button as A, GlassCard as j, Input as de, Select as M, SelectContent as N, SelectItem as P, SelectTrigger as F, SelectValue as I, Tabs as L, TabsContent as R, TabsList as z, TabsTrigger as B } from "@burdenoff/fe-libs/ui";
20
21
  //#region src/technospam/pages/ApplicationsProblemsPagePage.tsx
21
22
  function V({ problem: e, solved: t, onOpen: n }) {
22
23
  let i = r();
23
24
  return /* @__PURE__ */ O(j, {
24
25
  className: "group flex cursor-pointer flex-col overflow-hidden transition-all duration-200 hover:-translate-y-1 hover:shadow-lg",
25
- onClick: n,
26
26
  children: [/* @__PURE__ */ O(o, {
27
27
  seed: `${e.topic ?? ""} ${e.difficulty} ${e.title}`,
28
28
  icon: s(e.topic ?? e.title),
29
29
  children: [t ? /* @__PURE__ */ O("span", {
30
30
  className: "inline-flex items-center gap-1 rounded-full bg-status-success-bg-subtle px-2 py-0.5 text-[11px] font-medium text-status-success-text ring-1 ring-status-success-border/30",
31
31
  children: [
32
- /* @__PURE__ */ D(b, { size: 12 }),
32
+ /* @__PURE__ */ D(y, { size: 12 }),
33
33
  " ",
34
34
  i("technospam.problems.solved", "Solved")
35
35
  ]
@@ -38,7 +38,7 @@ function V({ problem: e, solved: t, onOpen: n }) {
38
38
  children: [/* @__PURE__ */ D(c, {
39
39
  status: e.difficulty,
40
40
  kind: "level"
41
- }), e.isPremiumOnly ? /* @__PURE__ */ D(d, { locked: e.isLocked }) : null]
41
+ }), e.isPremiumOnly ? /* @__PURE__ */ D(f, { locked: e.isLocked }) : null]
42
42
  })]
43
43
  }), /* @__PURE__ */ O("div", {
44
44
  className: "flex flex-1 flex-col gap-3 p-4",
@@ -47,7 +47,10 @@ function V({ problem: e, solved: t, onOpen: n }) {
47
47
  className: "min-w-0",
48
48
  children: [/* @__PURE__ */ D("h3", {
49
49
  className: "truncate text-base font-semibold text-text-primary group-hover:text-accent-primary",
50
- children: e.title
50
+ children: /* @__PURE__ */ D(m, {
51
+ onOpen: n,
52
+ children: e.title
53
+ })
51
54
  }), e.statement ? /* @__PURE__ */ D("p", {
52
55
  className: "mt-1 line-clamp-2 text-sm text-text-secondary",
53
56
  children: e.statement
@@ -75,7 +78,7 @@ function V({ problem: e, solved: t, onOpen: n }) {
75
78
  e.languages.length ? /* @__PURE__ */ O("span", {
76
79
  className: "inline-flex items-center gap-1",
77
80
  children: [
78
- /* @__PURE__ */ D(x, { size: 13 }),
81
+ /* @__PURE__ */ D(b, { size: 13 }),
79
82
  " ",
80
83
  e.languages.length === 1 ? i("technospam.problems.languages", "{{count}} lang", { count: e.languages.length }) : i("technospam.problems.languagesPlural", "{{count}} langs", { count: e.languages.length })
81
84
  ]
@@ -87,14 +90,14 @@ function V({ problem: e, solved: t, onOpen: n }) {
87
90
  children: [e.companies.slice(0, 3).map((e) => /* @__PURE__ */ O(k, {
88
91
  variant: "outline",
89
92
  className: "text-[11px] capitalize",
90
- children: [/* @__PURE__ */ D(y, {
93
+ children: [/* @__PURE__ */ D(v, {
91
94
  size: 10,
92
95
  className: "mr-1"
93
96
  }), e.replace(/-/g, " ")]
94
97
  }, e)), e.interviewFrequency === "HIGH" ? /* @__PURE__ */ O(k, {
95
98
  variant: "secondary",
96
99
  className: "text-[11px] text-status-warning-text",
97
- children: [/* @__PURE__ */ D(S, {
100
+ children: [/* @__PURE__ */ D(x, {
98
101
  size: 10,
99
102
  className: "mr-1"
100
103
  }), i("technospam.problems.frequentlyAsked", "Frequently asked")]
@@ -116,26 +119,26 @@ function V({ problem: e, solved: t, onOpen: n }) {
116
119
  });
117
120
  }
118
121
  function H() {
119
- let o = t(), { currentUser: s, workspaceId: c } = e(), { emit: d } = n(), y = r(), C = s?.id, [T, E] = v("ALL"), [k, j] = v("ALL"), [H, de] = v("ALL"), [U, fe] = v(""), [W, pe] = v(() => l(u())), G = g((e) => {
120
- pe(e), ee(u(), e);
121
- }, []), me = _(() => [
122
+ let o = t(), { currentUser: s, workspaceId: c } = e(), { emit: f } = n(), m = r(), v = s?.id, [C, T] = _("ALL"), [E, k] = _("ALL"), [j, H] = _("ALL"), [U, fe] = _(""), [W, pe] = _(() => l(u())), G = h((e) => {
123
+ pe(e), d(u(), e);
124
+ }, []), me = g(() => [
122
125
  {
123
126
  value: "ALL",
124
- label: y("technospam.problems.filterAll", "All")
127
+ label: m("technospam.problems.filterAll", "All")
125
128
  },
126
129
  {
127
130
  value: "EASY",
128
- label: y("technospam.problems.filterEasy", "Easy")
131
+ label: m("technospam.problems.filterEasy", "Easy")
129
132
  },
130
133
  {
131
134
  value: "MEDIUM",
132
- label: y("technospam.problems.filterMedium", "Medium")
135
+ label: m("technospam.problems.filterMedium", "Medium")
133
136
  },
134
137
  {
135
138
  value: "HARD",
136
- label: y("technospam.problems.filterHard", "Hard")
139
+ label: m("technospam.problems.filterHard", "Hard")
137
140
  }
138
- ], [y]), he = _(() => [
141
+ ], [m]), he = g(() => [
139
142
  {
140
143
  value: "google",
141
144
  label: "Google"
@@ -160,7 +163,7 @@ function H() {
160
163
  value: "netflix",
161
164
  label: "Netflix"
162
165
  }
163
- ], []), ge = _(() => [
166
+ ], []), ge = g(() => [
164
167
  {
165
168
  value: "frontend",
166
169
  label: "Frontend"
@@ -185,62 +188,62 @@ function H() {
185
188
  value: "sre",
186
189
  label: "SRE / Infra"
187
190
  }
188
- ], []), { limit: _e, more: ve } = ie(), { data: K, loading: q, error: J } = h({
191
+ ], []), { limit: _e, more: ve } = ae(), { data: K, loading: q, error: J } = oe({
189
192
  status: "PUBLISHED",
190
- pagination: re(_e),
191
- ...T === "ALL" ? {} : { difficulty: T },
192
- ...k === "ALL" ? {} : { company: k },
193
- ...H === "ALL" ? {} : { role: H }
194
- }), Y = ae(C), X = _(() => K?.tecListProblems?.items ?? [], [K]), Z = K?.tecListProblems?.pageInfo?.hasMore ?? !1, ye = X.filter((e) => Y.has(e.id)).length, be = X.filter((e) => e.difficulty === "EASY").length, xe = X.filter((e) => e.difficulty === "HARD").length, Q = _(() => {
193
+ pagination: ie(_e),
194
+ ...C === "ALL" ? {} : { difficulty: C },
195
+ ...E === "ALL" ? {} : { company: E },
196
+ ...j === "ALL" ? {} : { role: j }
197
+ }), Y = se(v), X = g(() => K?.tecListProblems?.items ?? [], [K]), Z = K?.tecListProblems?.pageInfo?.hasMore ?? !1, ye = X.filter((e) => Y.has(e.id)).length, be = X.filter((e) => e.difficulty === "EASY").length, xe = X.filter((e) => e.difficulty === "HARD").length, Q = g(() => {
195
198
  let e = U.trim().toLowerCase();
196
199
  return e ? X.filter((t) => t.title.toLowerCase().includes(e) || (t.topic ?? "").toLowerCase().includes(e) || t.tags.some((t) => t.toLowerCase().includes(e))) : X;
197
- }, [X, U]), $ = g((e) => {
198
- d("technospam.problem.viewed", {
200
+ }, [X, U]), $ = h((e) => {
201
+ f("technospam.problem.viewed", {
199
202
  workspaceId: c,
200
203
  entityId: e.id,
201
204
  entityType: "TEC_PROBLEM"
202
205
  }), o(`/applications/problem-details-page?id=${e.id}`);
203
206
  }, [
204
- d,
207
+ f,
205
208
  o,
206
209
  c
207
210
  ]);
208
211
  return /* @__PURE__ */ O(i, {
209
212
  hero: !0,
210
- title: y("technospam.problems.title", "Coding Problems"),
211
- description: y("technospam.problems.description", "Sharpen your problem-solving with hands-on, mentor-judged challenges across topics and difficulty."),
213
+ title: m("technospam.problems.title", "Coding Problems"),
214
+ description: m("technospam.problems.description", "Sharpen your problem-solving with hands-on, mentor-judged challenges across topics and difficulty."),
212
215
  children: [/* @__PURE__ */ O("div", {
213
216
  className: "mb-5 grid grid-cols-2 gap-3 sm:grid-cols-4",
214
217
  children: [
215
218
  /* @__PURE__ */ D(a, {
216
- label: y("technospam.problems.statProblems", "Problems"),
219
+ label: m("technospam.problems.statProblems", "Problems"),
217
220
  value: X.length,
218
- icon: x,
221
+ icon: b,
219
222
  tone: "blue"
220
223
  }),
221
224
  /* @__PURE__ */ D(a, {
222
- label: y("technospam.problems.statSolved", "Solved"),
225
+ label: m("technospam.problems.statSolved", "Solved"),
223
226
  value: ye,
224
- icon: b,
227
+ icon: y,
225
228
  tone: "green"
226
229
  }),
227
230
  /* @__PURE__ */ D(a, {
228
- label: y("technospam.problems.statEasy", "Easy"),
231
+ label: m("technospam.problems.statEasy", "Easy"),
229
232
  value: be,
230
- icon: se,
233
+ icon: S,
231
234
  tone: "teal"
232
235
  }),
233
236
  /* @__PURE__ */ D(a, {
234
- label: y("technospam.problems.statHard", "Hard"),
237
+ label: m("technospam.problems.statHard", "Hard"),
235
238
  value: xe,
236
- icon: S,
239
+ icon: x,
237
240
  tone: "amber"
238
241
  })
239
242
  ]
240
243
  }), /* @__PURE__ */ O(L, {
241
244
  className: "gap-0",
242
- value: T,
243
- onValueChange: (e) => E(e),
245
+ value: C,
246
+ onValueChange: (e) => T(e),
244
247
  children: [
245
248
  /* @__PURE__ */ O("div", {
246
249
  className: "mb-4 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",
@@ -249,18 +252,18 @@ function H() {
249
252
  children: e.label
250
253
  }, e.value)) }), /* @__PURE__ */ O("div", {
251
254
  className: "relative w-full sm:w-72",
252
- children: [/* @__PURE__ */ D(le, {
255
+ children: [/* @__PURE__ */ D(w, {
253
256
  className: "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-text-muted",
254
257
  size: 16
255
- }), /* @__PURE__ */ D(ue, {
258
+ }), /* @__PURE__ */ D(de, {
256
259
  className: "pl-9",
257
- "aria-label": y("technospam.problems.searchLabel", "Search problems"),
258
- placeholder: y("technospam.problems.searchPlaceholder", "Search problems…"),
260
+ "aria-label": m("technospam.problems.searchLabel", "Search problems"),
261
+ placeholder: m("technospam.problems.searchPlaceholder", "Search problems…"),
259
262
  value: U,
260
263
  onChange: (e) => fe(e.target.value),
261
264
  onBlur: () => {
262
265
  let e = U.trim();
263
- e && d("technospam.search.performed", {
266
+ e && f("technospam.search.performed", {
264
267
  workspaceId: c,
265
268
  entityType: "problem",
266
269
  queryLength: e.length
@@ -273,30 +276,30 @@ function H() {
273
276
  className: "mb-4 flex flex-col gap-3 sm:flex-row sm:items-center",
274
277
  children: [
275
278
  /* @__PURE__ */ O(M, {
276
- value: k,
277
- onValueChange: j,
279
+ value: E,
280
+ onValueChange: k,
278
281
  children: [/* @__PURE__ */ D(F, {
279
282
  className: "w-full sm:w-48",
280
- "aria-label": y("technospam.problems.companyFilterLabel", "Filter by company"),
281
- children: /* @__PURE__ */ D(I, { placeholder: y("technospam.problems.companyPlaceholder", "Company") })
283
+ "aria-label": m("technospam.problems.companyFilterLabel", "Filter by company"),
284
+ children: /* @__PURE__ */ D(I, { placeholder: m("technospam.problems.companyPlaceholder", "Company") })
282
285
  }), /* @__PURE__ */ O(N, { children: [/* @__PURE__ */ D(P, {
283
286
  value: "ALL",
284
- children: y("technospam.problems.companyAll", "All companies")
287
+ children: m("technospam.problems.companyAll", "All companies")
285
288
  }), he.map((e) => /* @__PURE__ */ D(P, {
286
289
  value: e.value,
287
290
  children: e.label
288
291
  }, e.value))] })]
289
292
  }),
290
293
  /* @__PURE__ */ O(M, {
291
- value: H,
292
- onValueChange: de,
294
+ value: j,
295
+ onValueChange: H,
293
296
  children: [/* @__PURE__ */ D(F, {
294
297
  className: "w-full sm:w-48",
295
- "aria-label": y("technospam.problems.roleFilterLabel", "Filter by role"),
296
- children: /* @__PURE__ */ D(I, { placeholder: y("technospam.problems.rolePlaceholder", "Role") })
298
+ "aria-label": m("technospam.problems.roleFilterLabel", "Filter by role"),
299
+ children: /* @__PURE__ */ D(I, { placeholder: m("technospam.problems.rolePlaceholder", "Role") })
297
300
  }), /* @__PURE__ */ O(N, { children: [/* @__PURE__ */ D(P, {
298
301
  value: "ALL",
299
- children: y("technospam.problems.roleAll", "All roles")
302
+ children: m("technospam.problems.roleAll", "All roles")
300
303
  }), ge.map((e) => /* @__PURE__ */ D(P, {
301
304
  value: e.value,
302
305
  children: e.label
@@ -304,7 +307,7 @@ function H() {
304
307
  }),
305
308
  /* @__PURE__ */ O("div", {
306
309
  role: "group",
307
- "aria-label": y("technospam.problems.viewLabel", "Catalog layout"),
310
+ "aria-label": m("technospam.problems.viewLabel", "Catalog layout"),
308
311
  className: "inline-flex items-center gap-1 self-start rounded-md border border-border-subtle bg-bg-surface p-1 sm:ml-auto sm:self-auto",
309
312
  children: [/* @__PURE__ */ O(A, {
310
313
  type: "button",
@@ -312,38 +315,38 @@ function H() {
312
315
  variant: W === "table" ? "secondary" : "ghost",
313
316
  "aria-pressed": W === "table",
314
317
  onClick: () => G("table"),
315
- children: [/* @__PURE__ */ D(ce, {
318
+ children: [/* @__PURE__ */ D(ue, {
316
319
  size: 14,
317
320
  className: "mr-1.5",
318
321
  "aria-hidden": "true"
319
- }), y("technospam.problems.viewTable", "Table")]
322
+ }), m("technospam.problems.viewTable", "Table")]
320
323
  }), /* @__PURE__ */ O(A, {
321
324
  type: "button",
322
325
  size: "sm",
323
326
  variant: W === "cards" ? "secondary" : "ghost",
324
327
  "aria-pressed": W === "cards",
325
328
  onClick: () => G("cards"),
326
- children: [/* @__PURE__ */ D(w, {
329
+ children: [/* @__PURE__ */ D(le, {
327
330
  size: 14,
328
331
  className: "mr-1.5",
329
332
  "aria-hidden": "true"
330
- }), y("technospam.problems.viewCards", "Cards")]
333
+ }), m("technospam.problems.viewCards", "Cards")]
331
334
  })]
332
335
  })
333
336
  ]
334
337
  }),
335
338
  /* @__PURE__ */ O(R, {
336
- value: T,
337
- className: oe,
339
+ value: C,
340
+ className: ce,
338
341
  children: [
339
- q && !X.length ? /* @__PURE__ */ D(ne, {}) : J ? /* @__PURE__ */ D(m, {
340
- title: y("technospam.common.errorLoadProblems", "Couldn't load problems"),
342
+ q && !X.length ? /* @__PURE__ */ D(p, {}) : J ? /* @__PURE__ */ D(re, {
343
+ title: m("technospam.common.errorLoadProblems", "Couldn't load problems"),
341
344
  error: J
342
- }) : Q.length === 0 ? /* @__PURE__ */ D(p, {
343
- icon: /* @__PURE__ */ D(x, { size: 26 }),
344
- title: U || T !== "ALL" || k !== "ALL" || H !== "ALL" ? y("technospam.problems.emptySearchTitle", "No matching problems") : y("technospam.problems.emptyDefaultTitle", "No problems published yet"),
345
- description: U || T !== "ALL" || k !== "ALL" || H !== "ALL" ? y("technospam.problems.emptySearchDesc", "Try a different search, difficulty, company, or role filter.") : y("technospam.problems.emptyDefaultDesc", "Published problems will appear here. Check back soon — TechnoSpam is pre-launch.")
346
- }) : W === "table" ? /* @__PURE__ */ D(f, {
345
+ }) : Q.length === 0 ? /* @__PURE__ */ D(ne, {
346
+ icon: /* @__PURE__ */ D(b, { size: 26 }),
347
+ title: U || C !== "ALL" || E !== "ALL" || j !== "ALL" ? m("technospam.problems.emptySearchTitle", "No matching problems") : m("technospam.problems.emptyDefaultTitle", "No problems published yet"),
348
+ description: U || C !== "ALL" || E !== "ALL" || j !== "ALL" ? m("technospam.problems.emptySearchDesc", "Try a different search, difficulty, company, or role filter.") : m("technospam.problems.emptyDefaultDesc", "Published problems will appear here. Check back soon — TechnoSpam is pre-launch.")
349
+ }) : W === "table" ? /* @__PURE__ */ D(ee, {
347
350
  problems: Q,
348
351
  solvedIds: Y,
349
352
  onOpen: $
@@ -357,10 +360,10 @@ function H() {
357
360
  }),
358
361
  Q.length > 0 && !J ? /* @__PURE__ */ D("p", {
359
362
  className: "mt-4 text-sm text-text-muted",
360
- children: Q.length < X.length ? y("technospam.problems.showingFiltered", "Showing {{shown}} of {{total}} loaded problems", {
363
+ children: Q.length < X.length ? m("technospam.problems.showingFiltered", "Showing {{shown}} of {{total}} loaded problems", {
361
364
  shown: Q.length,
362
365
  total: X.length
363
- }) : Z ? y("technospam.problems.showingMore", "Showing 1 to {{count}} problems — load more to see the rest", { count: Q.length }) : y("technospam.problems.showingAll", "Showing all {{count}} problems", { count: Q.length })
366
+ }) : Z ? m("technospam.problems.showingMore", "Showing 1 to {{count}} problems — load more to see the rest", { count: Q.length }) : m("technospam.problems.showingAll", "Showing all {{count}} problems", { count: Q.length })
364
367
  }) : null,
365
368
  /* @__PURE__ */ D(te, {
366
369
  hasMore: Z,