@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.
- package/dist/stories/journeys/Courses.stories.d.ts +5 -0
- package/dist/stories/journeys/Courses.stories.d.ts.map +1 -1
- package/dist/stories/journeys/Mentorship.stories.d.ts +5 -0
- package/dist/stories/journeys/Mentorship.stories.d.ts.map +1 -1
- package/dist/stories/journeys/Problems.stories.d.ts +5 -0
- package/dist/stories/journeys/Problems.stories.d.ts.map +1 -1
- package/dist/technospam/components/CardOpenButton.d.ts +26 -0
- package/dist/technospam/components/CardOpenButton.d.ts.map +1 -0
- package/dist/technospam/components/CardOpenButton.js +15 -0
- package/dist/technospam/components/CardOpenButton.js.map +1 -0
- package/dist/technospam/components/index.d.ts +1 -0
- package/dist/technospam/components/index.d.ts.map +1 -1
- package/dist/technospam/components/index.js +1 -0
- package/dist/technospam/pages/ApplicationsProblemsPagePage.d.ts.map +1 -1
- package/dist/technospam/pages/ApplicationsProblemsPagePage.js +80 -77
- package/dist/technospam/pages/ApplicationsProblemsPagePage.js.map +1 -1
- package/dist/technospam/pages/CoursesCoursesPagePage.d.ts.map +1 -1
- package/dist/technospam/pages/CoursesCoursesPagePage.js +68 -65
- package/dist/technospam/pages/CoursesCoursesPagePage.js.map +1 -1
- package/dist/technospam/pages/HackathonsHackathonsPagePage.d.ts.map +1 -1
- package/dist/technospam/pages/HackathonsHackathonsPagePage.js +75 -72
- package/dist/technospam/pages/HackathonsHackathonsPagePage.js.map +1 -1
- package/dist/technospam/pages/MentorshipMentorsPagePage.d.ts.map +1 -1
- package/dist/technospam/pages/MentorshipMentorsPagePage.js +1 -0
- package/dist/technospam/pages/MentorshipMentorsPagePage.js.map +1 -1
- 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;
|
|
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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ApplicationsProblemsPagePage.d.ts","sourceRoot":"","sources":["../../../src/technospam/pages/ApplicationsProblemsPagePage.tsx"],"names":[],"mappings":"
|
|
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
|
|
9
|
-
import { PremiumBadge as
|
|
10
|
-
import { ProblemsTable as
|
|
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
|
|
13
|
-
import { pageArg as
|
|
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
|
|
16
|
-
import { useCallback as
|
|
17
|
-
import { Building2 as
|
|
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
|
|
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(
|
|
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(
|
|
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:
|
|
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(
|
|
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(
|
|
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(
|
|
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:
|
|
120
|
-
pe(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:
|
|
127
|
+
label: m("technospam.problems.filterAll", "All")
|
|
125
128
|
},
|
|
126
129
|
{
|
|
127
130
|
value: "EASY",
|
|
128
|
-
label:
|
|
131
|
+
label: m("technospam.problems.filterEasy", "Easy")
|
|
129
132
|
},
|
|
130
133
|
{
|
|
131
134
|
value: "MEDIUM",
|
|
132
|
-
label:
|
|
135
|
+
label: m("technospam.problems.filterMedium", "Medium")
|
|
133
136
|
},
|
|
134
137
|
{
|
|
135
138
|
value: "HARD",
|
|
136
|
-
label:
|
|
139
|
+
label: m("technospam.problems.filterHard", "Hard")
|
|
137
140
|
}
|
|
138
|
-
], [
|
|
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 } =
|
|
191
|
+
], []), { limit: _e, more: ve } = ae(), { data: K, loading: q, error: J } = oe({
|
|
189
192
|
status: "PUBLISHED",
|
|
190
|
-
pagination:
|
|
191
|
-
...
|
|
192
|
-
...
|
|
193
|
-
...
|
|
194
|
-
}), Y =
|
|
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]), $ =
|
|
198
|
-
|
|
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
|
-
|
|
207
|
+
f,
|
|
205
208
|
o,
|
|
206
209
|
c
|
|
207
210
|
]);
|
|
208
211
|
return /* @__PURE__ */ O(i, {
|
|
209
212
|
hero: !0,
|
|
210
|
-
title:
|
|
211
|
-
description:
|
|
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:
|
|
219
|
+
label: m("technospam.problems.statProblems", "Problems"),
|
|
217
220
|
value: X.length,
|
|
218
|
-
icon:
|
|
221
|
+
icon: b,
|
|
219
222
|
tone: "blue"
|
|
220
223
|
}),
|
|
221
224
|
/* @__PURE__ */ D(a, {
|
|
222
|
-
label:
|
|
225
|
+
label: m("technospam.problems.statSolved", "Solved"),
|
|
223
226
|
value: ye,
|
|
224
|
-
icon:
|
|
227
|
+
icon: y,
|
|
225
228
|
tone: "green"
|
|
226
229
|
}),
|
|
227
230
|
/* @__PURE__ */ D(a, {
|
|
228
|
-
label:
|
|
231
|
+
label: m("technospam.problems.statEasy", "Easy"),
|
|
229
232
|
value: be,
|
|
230
|
-
icon:
|
|
233
|
+
icon: S,
|
|
231
234
|
tone: "teal"
|
|
232
235
|
}),
|
|
233
236
|
/* @__PURE__ */ D(a, {
|
|
234
|
-
label:
|
|
237
|
+
label: m("technospam.problems.statHard", "Hard"),
|
|
235
238
|
value: xe,
|
|
236
|
-
icon:
|
|
239
|
+
icon: x,
|
|
237
240
|
tone: "amber"
|
|
238
241
|
})
|
|
239
242
|
]
|
|
240
243
|
}), /* @__PURE__ */ O(L, {
|
|
241
244
|
className: "gap-0",
|
|
242
|
-
value:
|
|
243
|
-
onValueChange: (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(
|
|
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(
|
|
258
|
+
}), /* @__PURE__ */ D(de, {
|
|
256
259
|
className: "pl-9",
|
|
257
|
-
"aria-label":
|
|
258
|
-
placeholder:
|
|
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 &&
|
|
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:
|
|
277
|
-
onValueChange:
|
|
279
|
+
value: E,
|
|
280
|
+
onValueChange: k,
|
|
278
281
|
children: [/* @__PURE__ */ D(F, {
|
|
279
282
|
className: "w-full sm:w-48",
|
|
280
|
-
"aria-label":
|
|
281
|
-
children: /* @__PURE__ */ D(I, { placeholder:
|
|
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:
|
|
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:
|
|
292
|
-
onValueChange:
|
|
294
|
+
value: j,
|
|
295
|
+
onValueChange: H,
|
|
293
296
|
children: [/* @__PURE__ */ D(F, {
|
|
294
297
|
className: "w-full sm:w-48",
|
|
295
|
-
"aria-label":
|
|
296
|
-
children: /* @__PURE__ */ D(I, { placeholder:
|
|
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:
|
|
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":
|
|
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(
|
|
318
|
+
children: [/* @__PURE__ */ D(ue, {
|
|
316
319
|
size: 14,
|
|
317
320
|
className: "mr-1.5",
|
|
318
321
|
"aria-hidden": "true"
|
|
319
|
-
}),
|
|
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(
|
|
329
|
+
children: [/* @__PURE__ */ D(le, {
|
|
327
330
|
size: 14,
|
|
328
331
|
className: "mr-1.5",
|
|
329
332
|
"aria-hidden": "true"
|
|
330
|
-
}),
|
|
333
|
+
}), m("technospam.problems.viewCards", "Cards")]
|
|
331
334
|
})]
|
|
332
335
|
})
|
|
333
336
|
]
|
|
334
337
|
}),
|
|
335
338
|
/* @__PURE__ */ O(R, {
|
|
336
|
-
value:
|
|
337
|
-
className:
|
|
339
|
+
value: C,
|
|
340
|
+
className: ce,
|
|
338
341
|
children: [
|
|
339
|
-
q && !X.length ? /* @__PURE__ */ D(
|
|
340
|
-
title:
|
|
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(
|
|
343
|
-
icon: /* @__PURE__ */ D(
|
|
344
|
-
title: U ||
|
|
345
|
-
description: U ||
|
|
346
|
-
}) : W === "table" ? /* @__PURE__ */ D(
|
|
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 ?
|
|
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 ?
|
|
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,
|