@flamingo-stack/openframe-frontend-core 0.0.659-2347.6820.1 → 0.0.659-2347.6824.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-D4Z7TYWU.js → chunk-2DLM3NXE.js} +4 -4
- package/dist/{chunk-NIKCNKD2.js → chunk-6DVSTVUU.js} +6 -6
- package/dist/{chunk-VAXW73AH.js → chunk-6KR74SOJ.js} +2 -2
- package/dist/{chunk-VZLPXDYN.cjs → chunk-AOOORZI5.cjs} +3 -3
- package/dist/{chunk-VZLPXDYN.cjs.map → chunk-AOOORZI5.cjs.map} +1 -1
- package/dist/{chunk-DMJ636H5.js → chunk-APWQTZCR.js} +2 -2
- package/dist/chunk-BXWXBBAC.js +228 -0
- package/dist/chunk-BXWXBBAC.js.map +1 -0
- package/dist/{chunk-JBL365GX.js → chunk-E7C3F2SK.js} +237 -223
- package/dist/chunk-E7C3F2SK.js.map +1 -0
- package/dist/{chunk-VXTTNIRO.cjs → chunk-EOGXNLZC.cjs} +17 -17
- package/dist/{chunk-VXTTNIRO.cjs.map → chunk-EOGXNLZC.cjs.map} +1 -1
- package/dist/{chunk-BOZSCBHS.cjs → chunk-GDHV5W5C.cjs} +33 -33
- package/dist/{chunk-BOZSCBHS.cjs.map → chunk-GDHV5W5C.cjs.map} +1 -1
- package/dist/{chunk-FLWYFXNK.cjs → chunk-ITVLOEGF.cjs} +55 -55
- package/dist/{chunk-FLWYFXNK.cjs.map → chunk-ITVLOEGF.cjs.map} +1 -1
- package/dist/{chunk-K5HPBVUH.cjs → chunk-K4W3II7M.cjs} +3 -3
- package/dist/{chunk-K5HPBVUH.cjs.map → chunk-K4W3II7M.cjs.map} +1 -1
- package/dist/{chunk-J7OY7QBA.js → chunk-KP4K6I5O.js} +3 -3
- package/dist/{chunk-XBPTM4IT.cjs → chunk-L4YJU3AG.cjs} +16 -16
- package/dist/{chunk-XBPTM4IT.cjs.map → chunk-L4YJU3AG.cjs.map} +1 -1
- package/dist/{chunk-FXUFGHVU.js → chunk-MEFCA6VD.js} +2 -2
- package/dist/{chunk-S5OQILYF.js → chunk-MW7LEMFG.js} +2 -2
- package/dist/{chunk-PDLHEQ6C.cjs → chunk-NXAXZPEO.cjs} +10 -10
- package/dist/{chunk-PDLHEQ6C.cjs.map → chunk-NXAXZPEO.cjs.map} +1 -1
- package/dist/{chunk-I6Q5RA5M.js → chunk-P2ROGTMF.js} +2 -2
- package/dist/{chunk-ZUOXB5YX.cjs → chunk-PUE4XMZK.cjs} +279 -265
- package/dist/chunk-PUE4XMZK.cjs.map +1 -0
- package/dist/chunk-QVSVRG7I.cjs +228 -0
- package/dist/chunk-QVSVRG7I.cjs.map +1 -0
- package/dist/{chunk-XNR7DJP3.js → chunk-QVZD2LLU.js} +4 -4
- package/dist/{chunk-3CTLV2BR.cjs → chunk-RRGTBH3L.cjs} +3 -3
- package/dist/{chunk-3CTLV2BR.cjs.map → chunk-RRGTBH3L.cjs.map} +1 -1
- package/dist/{chunk-7Q4UWN5X.js → chunk-T6LNAX4R.js} +3 -3
- package/dist/{chunk-TUXQWRF7.cjs → chunk-UIAXQJPV.cjs} +24 -24
- package/dist/{chunk-TUXQWRF7.cjs.map → chunk-UIAXQJPV.cjs.map} +1 -1
- package/dist/{chunk-ALMCR73J.js → chunk-VFGBRGFB.js} +3 -3
- package/dist/{chunk-5IXTYDUH.cjs → chunk-VJMPYY5O.cjs} +18 -18
- package/dist/{chunk-5IXTYDUH.cjs.map → chunk-VJMPYY5O.cjs.map} +1 -1
- package/dist/{chunk-XGJUNSUY.js → chunk-VVOI2OC3.js} +2 -2
- package/dist/{chunk-MCGLT2GN.cjs → chunk-VW7NXM2O.cjs} +36 -36
- package/dist/{chunk-MCGLT2GN.cjs.map → chunk-VW7NXM2O.cjs.map} +1 -1
- package/dist/{chunk-WK4464NX.cjs → chunk-VWGFJJD6.cjs} +4 -4
- package/dist/{chunk-WK4464NX.cjs.map → chunk-VWGFJJD6.cjs.map} +1 -1
- package/dist/{chunk-NP2XVKA6.cjs → chunk-WMIB6JSA.cjs} +4 -4
- package/dist/{chunk-NP2XVKA6.cjs.map → chunk-WMIB6JSA.cjs.map} +1 -1
- package/dist/{chunk-OTDNJTDJ.js → chunk-WWEQT2WX.js} +5 -5
- package/dist/{chunk-XRD5FFHK.cjs → chunk-Z7NI2TQD.cjs} +3 -3
- package/dist/{chunk-XRD5FFHK.cjs.map → chunk-Z7NI2TQD.cjs.map} +1 -1
- package/dist/{chunk-CCGP4PRB.js → chunk-ZT3CZCDS.js} +2 -2
- package/dist/components/case-studies/index.cjs +12 -12
- package/dist/components/case-studies/index.js +3 -3
- package/dist/components/contact/index.cjs +4 -4
- package/dist/components/contact/index.js +3 -3
- package/dist/components/docs/index.cjs +7 -7
- package/dist/components/docs/index.js +6 -6
- package/dist/components/embeds/index.cjs +4 -4
- package/dist/components/embeds/index.js +3 -3
- package/dist/components/faq/index.cjs +4 -4
- package/dist/components/faq/index.js +3 -3
- package/dist/components/features/index.cjs +3 -3
- package/dist/components/features/index.js +2 -2
- package/dist/components/help-center-pages/index.cjs +23 -23
- package/dist/components/help-center-pages/index.js +14 -14
- package/dist/components/index.cjs +33 -33
- package/dist/components/index.js +13 -13
- package/dist/components/meeting-scheduler/index.cjs +27 -27
- package/dist/components/meeting-scheduler/index.js +2 -2
- package/dist/components/navigation/index.cjs +6 -6
- package/dist/components/navigation/index.js +5 -5
- package/dist/components/onboarding-guides/index.cjs +6 -6
- package/dist/components/onboarding-guides/index.js +5 -5
- package/dist/components/tickets/index.cjs +7 -7
- package/dist/components/tickets/index.js +6 -6
- package/dist/components/ui/autocomplete.d.ts.map +1 -1
- package/dist/components/ui/date-picker.d.ts +2 -2
- package/dist/components/ui/date-picker.d.ts.map +1 -1
- package/dist/components/ui/field-wrapper.d.ts +15 -1
- package/dist/components/ui/field-wrapper.d.ts.map +1 -1
- package/dist/components/ui/file-manager/index.cjs +4 -4
- package/dist/components/ui/file-manager/index.js +1 -1
- package/dist/components/ui/index.cjs +3 -3
- package/dist/components/ui/index.js +2 -2
- package/dist/components/ui/input.d.ts.map +1 -1
- package/dist/components/ui/select.d.ts.map +1 -1
- package/dist/components/ui/textarea.d.ts.map +1 -1
- package/dist/index.cjs +7 -7
- package/dist/index.js +6 -6
- package/package.json +1 -1
- package/src/components/ui/__tests__/field-wrapper-error-slot.test.tsx +82 -0
- package/src/components/ui/autocomplete.tsx +7 -1
- package/src/components/ui/date-picker.tsx +40 -38
- package/src/components/ui/field-wrapper.tsx +27 -3
- package/src/components/ui/input.tsx +131 -121
- package/src/components/ui/select.tsx +5 -2
- package/src/components/ui/textarea.tsx +173 -175
- package/dist/chunk-IWISVG4P.js +0 -198
- package/dist/chunk-IWISVG4P.js.map +0 -1
- package/dist/chunk-JBL365GX.js.map +0 -1
- package/dist/chunk-YWUZL3RT.cjs +0 -198
- package/dist/chunk-YWUZL3RT.cjs.map +0 -1
- package/dist/chunk-ZUOXB5YX.cjs.map +0 -1
- /package/dist/{chunk-D4Z7TYWU.js.map → chunk-2DLM3NXE.js.map} +0 -0
- /package/dist/{chunk-NIKCNKD2.js.map → chunk-6DVSTVUU.js.map} +0 -0
- /package/dist/{chunk-VAXW73AH.js.map → chunk-6KR74SOJ.js.map} +0 -0
- /package/dist/{chunk-DMJ636H5.js.map → chunk-APWQTZCR.js.map} +0 -0
- /package/dist/{chunk-J7OY7QBA.js.map → chunk-KP4K6I5O.js.map} +0 -0
- /package/dist/{chunk-FXUFGHVU.js.map → chunk-MEFCA6VD.js.map} +0 -0
- /package/dist/{chunk-S5OQILYF.js.map → chunk-MW7LEMFG.js.map} +0 -0
- /package/dist/{chunk-I6Q5RA5M.js.map → chunk-P2ROGTMF.js.map} +0 -0
- /package/dist/{chunk-XNR7DJP3.js.map → chunk-QVZD2LLU.js.map} +0 -0
- /package/dist/{chunk-7Q4UWN5X.js.map → chunk-T6LNAX4R.js.map} +0 -0
- /package/dist/{chunk-ALMCR73J.js.map → chunk-VFGBRGFB.js.map} +0 -0
- /package/dist/{chunk-XGJUNSUY.js.map → chunk-VVOI2OC3.js.map} +0 -0
- /package/dist/{chunk-OTDNJTDJ.js.map → chunk-WWEQT2WX.js.map} +0 -0
- /package/dist/{chunk-CCGP4PRB.js.map → chunk-ZT3CZCDS.js.map} +0 -0
|
@@ -5,13 +5,13 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
DeliveryRow,
|
|
7
7
|
ListEmptyState
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-APWQTZCR.js";
|
|
9
9
|
import {
|
|
10
10
|
EmptyState
|
|
11
11
|
} from "./chunk-5ONM3FHQ.js";
|
|
12
12
|
import {
|
|
13
13
|
DetailPageSkeleton
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-MW7LEMFG.js";
|
|
15
15
|
import {
|
|
16
16
|
useSelfFetch
|
|
17
17
|
} from "./chunk-KKSSA4CS.js";
|
|
@@ -30,7 +30,7 @@ import {
|
|
|
30
30
|
RichMarkdownRenderer,
|
|
31
31
|
devSectionAnchorId,
|
|
32
32
|
resolveContentHref
|
|
33
|
-
} from "./chunk-
|
|
33
|
+
} from "./chunk-E7C3F2SK.js";
|
|
34
34
|
import {
|
|
35
35
|
useHumanitySignals,
|
|
36
36
|
useScrollToHash
|
|
@@ -1373,4 +1373,4 @@ export {
|
|
|
1373
1373
|
useLegalDocs,
|
|
1374
1374
|
LegalDocumentPage
|
|
1375
1375
|
};
|
|
1376
|
-
//# sourceMappingURL=chunk-
|
|
1376
|
+
//# sourceMappingURL=chunk-2DLM3NXE.js.map
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import {
|
|
3
3
|
ContactForm
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-KP4K6I5O.js";
|
|
5
5
|
import {
|
|
6
6
|
DeliveryRow,
|
|
7
7
|
DevCardRowContent,
|
|
8
8
|
DevCardRowSkeletonList,
|
|
9
9
|
DevSectionPage,
|
|
10
10
|
ListEmptyState
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-APWQTZCR.js";
|
|
12
12
|
import {
|
|
13
13
|
EmptyState,
|
|
14
14
|
UnifiedPagination
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
TOAST_COPY,
|
|
20
20
|
isOptimistic,
|
|
21
21
|
useOptionalTicketLive
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-6KR74SOJ.js";
|
|
23
23
|
import {
|
|
24
24
|
AlertDialog,
|
|
25
25
|
AlertDialogAction,
|
|
@@ -35,7 +35,7 @@ import {
|
|
|
35
35
|
Textarea,
|
|
36
36
|
TicketAttachmentsList,
|
|
37
37
|
devSectionAnchorId
|
|
38
|
-
} from "./chunk-
|
|
38
|
+
} from "./chunk-E7C3F2SK.js";
|
|
39
39
|
import {
|
|
40
40
|
toast,
|
|
41
41
|
useScrollToHash
|
|
@@ -48,7 +48,7 @@ import {
|
|
|
48
48
|
import {
|
|
49
49
|
Input,
|
|
50
50
|
RequiredMark
|
|
51
|
-
} from "./chunk-
|
|
51
|
+
} from "./chunk-BXWXBBAC.js";
|
|
52
52
|
import {
|
|
53
53
|
ChatAttachmentAddButton,
|
|
54
54
|
ChatAttachmentChipStrip,
|
|
@@ -1833,4 +1833,4 @@ export {
|
|
|
1833
1833
|
HelpCenterCreateForm,
|
|
1834
1834
|
HelpCenterList
|
|
1835
1835
|
};
|
|
1836
|
-
//# sourceMappingURL=chunk-
|
|
1836
|
+
//# sourceMappingURL=chunk-6DVSTVUU.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import {
|
|
3
3
|
createSseSubscription
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-E7C3F2SK.js";
|
|
5
5
|
import {
|
|
6
6
|
useChatIdentity
|
|
7
7
|
} from "./chunk-H7ORPMRH.js";
|
|
@@ -275,4 +275,4 @@ export {
|
|
|
275
275
|
TICKET_MARK_READ_DEBOUNCE_MS,
|
|
276
276
|
TOAST_COPY
|
|
277
277
|
};
|
|
278
|
-
//# sourceMappingURL=chunk-
|
|
278
|
+
//# sourceMappingURL=chunk-6KR74SOJ.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }"use client";
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkPUE4XMZKcjs = require('./chunk-PUE4XMZK.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
@@ -56,7 +56,7 @@ function DetailPageSkeleton({
|
|
|
56
56
|
] }, section))
|
|
57
57
|
] });
|
|
58
58
|
if (bare) return content;
|
|
59
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
59
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkPUE4XMZKcjs.PageLayout, { showHeader: false, className: "mx-auto max-w-[1280px] bg-ods-bg px-6 py-6 md:px-20 md:py-10", children: content });
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
// src/components/shared/article-author-byline.tsx
|
|
@@ -137,4 +137,4 @@ function ArticleAuthorByline({
|
|
|
137
137
|
|
|
138
138
|
|
|
139
139
|
exports.DetailPageSkeleton = DetailPageSkeleton; exports.ArticleAuthorByline = ArticleAuthorByline;
|
|
140
|
-
//# sourceMappingURL=chunk-
|
|
140
|
+
//# sourceMappingURL=chunk-AOOORZI5.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-VZLPXDYN.cjs","../src/components/shared/detail-page-skeleton.tsx","../src/components/shared/article-author-byline.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-VZLPXDYN.cjs","sourcesContent":[null,"'use client';\n\nimport { PageLayout } from '../layout/page-layout';\n\nexport interface DetailPageSkeletonProps {\n metadataColumns?: number; // Number of metadata grid columns (default 4)\n showImageGallery?: boolean; // Show horizontal image gallery (default true)\n /** Render only the skeleton blocks, WITHOUT the self-contained page wrapper\n * — the caller supplies its own (e.g. `<PageShell>`) so the loading state\n * matches the loaded page's width, padding, and min-height. Default false\n * (self-contained `<PageLayout>` at the hub article width). */\n bare?: boolean;\n}\n\nexport function DetailPageSkeleton({\n metadataColumns = 4,\n showImageGallery = true,\n bare = false,\n}: DetailPageSkeletonProps = {}) {\n const content = (\n <div className=\"animate-pulse space-y-6 md:space-y-10\">\n {/* Title Block */}\n <div className=\"flex w-full flex-col gap-6\">\n <div className=\"h-16 w-full max-w-3xl rounded bg-ods-card md:h-20\"></div>\n </div>\n\n {/* Category Tags Skeleton */}\n <div className=\"flex w-full flex-wrap gap-2\">\n <div className=\"h-8 w-32 rounded bg-ods-card\"></div>\n <div className=\"h-8 w-28 rounded bg-ods-card\"></div>\n <div className=\"h-8 w-36 rounded bg-ods-card\"></div>\n </div>\n\n {/* Metadata Grid Skeleton */}\n <div\n className={`grid grid-cols-1 md:grid-cols-${metadataColumns} w-full overflow-hidden rounded-md border border-ods-border`}\n >\n {Array.from({ length: metadataColumns }).map((_, i) => (\n <div key={i} className=\"border-b border-ods-border bg-ods-card p-4 last:border-r-0 md:border-b-0 md:border-r\">\n <div className=\"mb-2 h-6 w-24 rounded bg-ods-border\"></div>\n <div className=\"h-5 w-20 rounded bg-ods-border\"></div>\n </div>\n ))}\n </div>\n\n {/* Image Gallery Skeleton */}\n {showImageGallery && (\n <div className=\"flex w-full gap-6 overflow-x-auto\">\n {[1, 2, 3, 4, 5].map(i => (\n <div key={i} className=\"h-[200px] w-[240px] shrink-0 rounded-md border border-ods-border bg-ods-card\"></div>\n ))}\n </div>\n )}\n\n {/* Featured Image Skeleton (for case studies) */}\n {!showImageGallery && <div className=\"aspect-[2560/1366] w-full rounded-md bg-ods-card\"></div>}\n\n {/* Content Sections Skeleton */}\n {[1, 2, 3].map(section => (\n <div key={section} className=\"space-y-6\">\n <div className=\"h-16 w-64 rounded bg-ods-card\"></div>\n <div className=\"space-y-3\">\n <div className=\"h-6 w-full rounded bg-ods-card\"></div>\n <div className=\"h-6 w-full rounded bg-ods-card\"></div>\n <div className=\"h-6 w-4/5 rounded bg-ods-card\"></div>\n </div>\n </div>\n ))}\n </div>\n );\n if (bare) return content;\n return (\n <PageLayout showHeader={false} className=\"mx-auto max-w-[1280px] bg-ods-bg px-6 py-6 md:px-20 md:py-10\">\n {content}\n </PageLayout>\n );\n}\n","'use client';\n\n/**\n * Shared \"author byline\" card used by article-shaped detail pages\n * (blog post, product release, onboarding guide, investor update).\n *\n * MOVED from the hub so any consuming app can embed it; hub call sites\n * import it directly and pass their platform-aware copy explicitly\n * (`fallbackBio={defaultAuthorFallbackBio()}` from the hub's app-config).\n *\n * Embed-readiness contract:\n * - `Link` / `Image` render through the embed-shims (plain `<a>` / `<img>`\n * in non-Next hosts; the real Next primitives once the host registers\n * them at app init).\n * - The avatar is proxied through the OPTIONAL ambient `ChatRuntime`\n * (`endpoints.imageProxyUrlPrefix`, same config `useProxiedImageUrl`\n * reads) — when no runtime is mounted the raw URL renders as-is, so the\n * component never throws outside a provider. Hosts can also inject\n * `proxyImageUrl` to bypass the runtime entirely.\n * - `fallbackBio` is a PLAIN prop (no app-config import): the lib has no\n * platform awareness; pass copy or leave it absent to render nothing.\n *\n * Render order: avatar → name + job title + date → bio (when present).\n * Returns null when `author` is empty (no card rendered).\n */\n\nimport { Calendar, User } from 'lucide-react';\nimport { useChatRuntime } from '../../contexts/chat-runtime-context';\nimport Image from '../../embed-shims/next-image';\nimport Link from '../../embed-shims/next-link';\nimport { cn } from '../../utils/cn';\nimport { formatBioText, formatDateWithTimezone } from '../../utils/format';\nimport { getProxiedImageUrl } from '../../utils/image-proxy';\n\nexport interface ArticleAuthorBylineProps {\n /** Author display name. Required — block is hidden when null/empty. */\n author: string | null;\n /** Avatar URL. Falls back to a placeholder when null. */\n avatar?: string | null;\n /** Optional bio paragraph rendered below the name. */\n bio?: string | null;\n /** Optional job title rendered immediately under the name. */\n jobTitle?: string | null;\n /** Optional published date (ISO string or Date). Rendered next to the name. */\n publishedAt?: string | Date | null;\n /** Optional link target for the author name (e.g. the author page). */\n href?: string | null;\n /**\n * Fallback paragraph when `bio` is empty. Plain copy — the lib has no\n * platform/config awareness, so hosts that want a branded default\n * (\"Contributing author on the {platform} platform\") pass it explicitly\n * (the hub wrapper derives it from `getAppConfig()`). Absent/null ⇒\n * nothing renders below the name when `bio` is empty.\n */\n fallbackBio?: string | null;\n /** Avatar size variant. `md` = 56px (default), `lg` = 64px. */\n size?: 'md' | 'lg';\n /**\n * Host-injected avatar-URL mapper. Wins over the ambient-runtime proxy\n * resolution. Use when the host proxies images outside the `ChatRuntime`\n * config (e.g. a bespoke CDN rewrite).\n */\n proxyImageUrl?: (url: string) => string;\n className?: string;\n}\n\nfunction formatDate(value: string | Date): string {\n // A published date is a content date: UTC-pinned through the one renderer, so\n // the server and every client agree on the day (React #418).\n return formatDateWithTimezone(value, null, 'long');\n}\n\nexport function ArticleAuthorByline({\n author,\n avatar,\n bio,\n jobTitle,\n publishedAt,\n href,\n fallbackBio,\n size = 'md',\n proxyImageUrl,\n className,\n}: ArticleAuthorBylineProps) {\n // Optional runtime — `useChatRuntime` returns null outside a provider, so\n // the byline works in bare embeds (raw avatar URL) and proxies whenever the\n // host mounted a runtime with `imageProxyUrlPrefix` (the hub always does).\n const runtime = useChatRuntime();\n if (!author) return null;\n\n const proxiedAvatar = avatar\n ? proxyImageUrl\n ? proxyImageUrl(avatar)\n : (getProxiedImageUrl(avatar, {\n proxyPrefix: runtime?.endpoints.imageProxyUrlPrefix,\n skipDomains: runtime?.endpoints.imageProxySkipDomains,\n directHttps: true,\n }) ?? avatar)\n : '';\n\n // Class-driven sizing (md = 56px, lg = 64px). The numeric pair feeds only\n // the Image element's intrinsic width/height attributes (required by the\n // Next image shim) — layout comes from the classes.\n const avatarSizeClass = size === 'lg' ? 'w-16 h-16' : 'w-14 h-14';\n const avatarIconClass = size === 'lg' ? 'w-8 h-8' : 'w-7 h-7';\n const avatarDim = size === 'lg' ? 64 : 56;\n const formattedBio = formatBioText(bio ?? null);\n const dateLabel = publishedAt ? formatDate(publishedAt) : '';\n\n return (\n <div\n className={cn(\n 'rounded-lg border border-ods-border bg-ods-card p-6',\n 'flex flex-col items-start gap-4 md:flex-row',\n className,\n )}\n >\n {/* Avatar */}\n <div className=\"flex-shrink-0\">\n {avatar ? (\n <Image\n src={proxiedAvatar || avatar}\n alt={author}\n width={avatarDim}\n height={avatarDim}\n className={cn('rounded-full border-2 border-ods-border object-cover', avatarSizeClass)}\n />\n ) : (\n <div\n className={cn(\n 'flex items-center justify-center rounded-full border-2 border-ods-border bg-ods-bg',\n avatarSizeClass,\n )}\n >\n <User className={cn('text-ods-text-secondary', avatarIconClass)} />\n </div>\n )}\n </div>\n\n {/* Name + meta + bio */}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-baseline gap-x-3 gap-y-1\">\n <h3 className=\"text-ods-text-primary text-h5\">\n {href ? (\n <Link href={href} className=\"transition-colors hover:text-ods-accent\">\n {author}\n </Link>\n ) : (\n author\n )}\n </h3>\n {dateLabel && (\n <span className=\"text-body-sm inline-flex items-center gap-1 font-body text-ods-text-secondary\">\n <Calendar className=\"h-3 w-3\" />\n {dateLabel}\n </span>\n )}\n </div>\n {jobTitle && <p className=\"text-body-sm mt-0.5 font-body text-ods-text-secondary\">{jobTitle}</p>}\n {formattedBio ? (\n <p className=\"text-body-md mt-2 font-body leading-relaxed text-ods-text-secondary\">{formattedBio}</p>\n ) : fallbackBio ? (\n <p className=\"text-body-md mt-2 font-body italic text-ods-text-secondary\">{fallbackBio}</p>\n ) : null}\n </div>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-AOOORZI5.cjs","../src/components/shared/detail-page-skeleton.tsx","../src/components/shared/article-author-byline.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-AOOORZI5.cjs","sourcesContent":[null,"'use client';\n\nimport { PageLayout } from '../layout/page-layout';\n\nexport interface DetailPageSkeletonProps {\n metadataColumns?: number; // Number of metadata grid columns (default 4)\n showImageGallery?: boolean; // Show horizontal image gallery (default true)\n /** Render only the skeleton blocks, WITHOUT the self-contained page wrapper\n * — the caller supplies its own (e.g. `<PageShell>`) so the loading state\n * matches the loaded page's width, padding, and min-height. Default false\n * (self-contained `<PageLayout>` at the hub article width). */\n bare?: boolean;\n}\n\nexport function DetailPageSkeleton({\n metadataColumns = 4,\n showImageGallery = true,\n bare = false,\n}: DetailPageSkeletonProps = {}) {\n const content = (\n <div className=\"animate-pulse space-y-6 md:space-y-10\">\n {/* Title Block */}\n <div className=\"flex w-full flex-col gap-6\">\n <div className=\"h-16 w-full max-w-3xl rounded bg-ods-card md:h-20\"></div>\n </div>\n\n {/* Category Tags Skeleton */}\n <div className=\"flex w-full flex-wrap gap-2\">\n <div className=\"h-8 w-32 rounded bg-ods-card\"></div>\n <div className=\"h-8 w-28 rounded bg-ods-card\"></div>\n <div className=\"h-8 w-36 rounded bg-ods-card\"></div>\n </div>\n\n {/* Metadata Grid Skeleton */}\n <div\n className={`grid grid-cols-1 md:grid-cols-${metadataColumns} w-full overflow-hidden rounded-md border border-ods-border`}\n >\n {Array.from({ length: metadataColumns }).map((_, i) => (\n <div key={i} className=\"border-b border-ods-border bg-ods-card p-4 last:border-r-0 md:border-b-0 md:border-r\">\n <div className=\"mb-2 h-6 w-24 rounded bg-ods-border\"></div>\n <div className=\"h-5 w-20 rounded bg-ods-border\"></div>\n </div>\n ))}\n </div>\n\n {/* Image Gallery Skeleton */}\n {showImageGallery && (\n <div className=\"flex w-full gap-6 overflow-x-auto\">\n {[1, 2, 3, 4, 5].map(i => (\n <div key={i} className=\"h-[200px] w-[240px] shrink-0 rounded-md border border-ods-border bg-ods-card\"></div>\n ))}\n </div>\n )}\n\n {/* Featured Image Skeleton (for case studies) */}\n {!showImageGallery && <div className=\"aspect-[2560/1366] w-full rounded-md bg-ods-card\"></div>}\n\n {/* Content Sections Skeleton */}\n {[1, 2, 3].map(section => (\n <div key={section} className=\"space-y-6\">\n <div className=\"h-16 w-64 rounded bg-ods-card\"></div>\n <div className=\"space-y-3\">\n <div className=\"h-6 w-full rounded bg-ods-card\"></div>\n <div className=\"h-6 w-full rounded bg-ods-card\"></div>\n <div className=\"h-6 w-4/5 rounded bg-ods-card\"></div>\n </div>\n </div>\n ))}\n </div>\n );\n if (bare) return content;\n return (\n <PageLayout showHeader={false} className=\"mx-auto max-w-[1280px] bg-ods-bg px-6 py-6 md:px-20 md:py-10\">\n {content}\n </PageLayout>\n );\n}\n","'use client';\n\n/**\n * Shared \"author byline\" card used by article-shaped detail pages\n * (blog post, product release, onboarding guide, investor update).\n *\n * MOVED from the hub so any consuming app can embed it; hub call sites\n * import it directly and pass their platform-aware copy explicitly\n * (`fallbackBio={defaultAuthorFallbackBio()}` from the hub's app-config).\n *\n * Embed-readiness contract:\n * - `Link` / `Image` render through the embed-shims (plain `<a>` / `<img>`\n * in non-Next hosts; the real Next primitives once the host registers\n * them at app init).\n * - The avatar is proxied through the OPTIONAL ambient `ChatRuntime`\n * (`endpoints.imageProxyUrlPrefix`, same config `useProxiedImageUrl`\n * reads) — when no runtime is mounted the raw URL renders as-is, so the\n * component never throws outside a provider. Hosts can also inject\n * `proxyImageUrl` to bypass the runtime entirely.\n * - `fallbackBio` is a PLAIN prop (no app-config import): the lib has no\n * platform awareness; pass copy or leave it absent to render nothing.\n *\n * Render order: avatar → name + job title + date → bio (when present).\n * Returns null when `author` is empty (no card rendered).\n */\n\nimport { Calendar, User } from 'lucide-react';\nimport { useChatRuntime } from '../../contexts/chat-runtime-context';\nimport Image from '../../embed-shims/next-image';\nimport Link from '../../embed-shims/next-link';\nimport { cn } from '../../utils/cn';\nimport { formatBioText, formatDateWithTimezone } from '../../utils/format';\nimport { getProxiedImageUrl } from '../../utils/image-proxy';\n\nexport interface ArticleAuthorBylineProps {\n /** Author display name. Required — block is hidden when null/empty. */\n author: string | null;\n /** Avatar URL. Falls back to a placeholder when null. */\n avatar?: string | null;\n /** Optional bio paragraph rendered below the name. */\n bio?: string | null;\n /** Optional job title rendered immediately under the name. */\n jobTitle?: string | null;\n /** Optional published date (ISO string or Date). Rendered next to the name. */\n publishedAt?: string | Date | null;\n /** Optional link target for the author name (e.g. the author page). */\n href?: string | null;\n /**\n * Fallback paragraph when `bio` is empty. Plain copy — the lib has no\n * platform/config awareness, so hosts that want a branded default\n * (\"Contributing author on the {platform} platform\") pass it explicitly\n * (the hub wrapper derives it from `getAppConfig()`). Absent/null ⇒\n * nothing renders below the name when `bio` is empty.\n */\n fallbackBio?: string | null;\n /** Avatar size variant. `md` = 56px (default), `lg` = 64px. */\n size?: 'md' | 'lg';\n /**\n * Host-injected avatar-URL mapper. Wins over the ambient-runtime proxy\n * resolution. Use when the host proxies images outside the `ChatRuntime`\n * config (e.g. a bespoke CDN rewrite).\n */\n proxyImageUrl?: (url: string) => string;\n className?: string;\n}\n\nfunction formatDate(value: string | Date): string {\n // A published date is a content date: UTC-pinned through the one renderer, so\n // the server and every client agree on the day (React #418).\n return formatDateWithTimezone(value, null, 'long');\n}\n\nexport function ArticleAuthorByline({\n author,\n avatar,\n bio,\n jobTitle,\n publishedAt,\n href,\n fallbackBio,\n size = 'md',\n proxyImageUrl,\n className,\n}: ArticleAuthorBylineProps) {\n // Optional runtime — `useChatRuntime` returns null outside a provider, so\n // the byline works in bare embeds (raw avatar URL) and proxies whenever the\n // host mounted a runtime with `imageProxyUrlPrefix` (the hub always does).\n const runtime = useChatRuntime();\n if (!author) return null;\n\n const proxiedAvatar = avatar\n ? proxyImageUrl\n ? proxyImageUrl(avatar)\n : (getProxiedImageUrl(avatar, {\n proxyPrefix: runtime?.endpoints.imageProxyUrlPrefix,\n skipDomains: runtime?.endpoints.imageProxySkipDomains,\n directHttps: true,\n }) ?? avatar)\n : '';\n\n // Class-driven sizing (md = 56px, lg = 64px). The numeric pair feeds only\n // the Image element's intrinsic width/height attributes (required by the\n // Next image shim) — layout comes from the classes.\n const avatarSizeClass = size === 'lg' ? 'w-16 h-16' : 'w-14 h-14';\n const avatarIconClass = size === 'lg' ? 'w-8 h-8' : 'w-7 h-7';\n const avatarDim = size === 'lg' ? 64 : 56;\n const formattedBio = formatBioText(bio ?? null);\n const dateLabel = publishedAt ? formatDate(publishedAt) : '';\n\n return (\n <div\n className={cn(\n 'rounded-lg border border-ods-border bg-ods-card p-6',\n 'flex flex-col items-start gap-4 md:flex-row',\n className,\n )}\n >\n {/* Avatar */}\n <div className=\"flex-shrink-0\">\n {avatar ? (\n <Image\n src={proxiedAvatar || avatar}\n alt={author}\n width={avatarDim}\n height={avatarDim}\n className={cn('rounded-full border-2 border-ods-border object-cover', avatarSizeClass)}\n />\n ) : (\n <div\n className={cn(\n 'flex items-center justify-center rounded-full border-2 border-ods-border bg-ods-bg',\n avatarSizeClass,\n )}\n >\n <User className={cn('text-ods-text-secondary', avatarIconClass)} />\n </div>\n )}\n </div>\n\n {/* Name + meta + bio */}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-baseline gap-x-3 gap-y-1\">\n <h3 className=\"text-ods-text-primary text-h5\">\n {href ? (\n <Link href={href} className=\"transition-colors hover:text-ods-accent\">\n {author}\n </Link>\n ) : (\n author\n )}\n </h3>\n {dateLabel && (\n <span className=\"text-body-sm inline-flex items-center gap-1 font-body text-ods-text-secondary\">\n <Calendar className=\"h-3 w-3\" />\n {dateLabel}\n </span>\n )}\n </div>\n {jobTitle && <p className=\"text-body-sm mt-0.5 font-body text-ods-text-secondary\">{jobTitle}</p>}\n {formattedBio ? (\n <p className=\"text-body-md mt-2 font-body leading-relaxed text-ods-text-secondary\">{formattedBio}</p>\n ) : fallbackBio ? (\n <p className=\"text-body-md mt-2 font-body italic text-ods-text-secondary\">{fallbackBio}</p>\n ) : null}\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
StatusFilterComponent,
|
|
11
11
|
TASK_TYPE_LABELS,
|
|
12
12
|
TASK_TYPE_TEXT_COLORS
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-E7C3F2SK.js";
|
|
14
14
|
import {
|
|
15
15
|
usePathname,
|
|
16
16
|
useRouter,
|
|
@@ -302,4 +302,4 @@ export {
|
|
|
302
302
|
DevCardRowSkeletonList,
|
|
303
303
|
DeliveryRow
|
|
304
304
|
};
|
|
305
|
-
//# sourceMappingURL=chunk-
|
|
305
|
+
//# sourceMappingURL=chunk-APWQTZCR.js.map
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
Label
|
|
4
|
+
} from "./chunk-XBTZOO74.js";
|
|
5
|
+
import {
|
|
6
|
+
CheckboxCheckmarkIcon
|
|
7
|
+
} from "./chunk-6U3IUD57.js";
|
|
8
|
+
import {
|
|
9
|
+
cn
|
|
10
|
+
} from "./chunk-OXB6LRBK.js";
|
|
11
|
+
|
|
12
|
+
// src/components/ui/required-mark.tsx
|
|
13
|
+
import { jsx } from "react/jsx-runtime";
|
|
14
|
+
function RequiredMark() {
|
|
15
|
+
return /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "text-ods-accent", children: "*" });
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// src/components/ui/field-wrapper.tsx
|
|
19
|
+
import { forwardRef } from "react";
|
|
20
|
+
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
21
|
+
var errorVariantClasses = {
|
|
22
|
+
error: "text-ods-error",
|
|
23
|
+
warning: "text-ods-warning",
|
|
24
|
+
success: "text-ods-success",
|
|
25
|
+
muted: "text-ods-text-secondary"
|
|
26
|
+
};
|
|
27
|
+
var FieldWrapper = forwardRef(
|
|
28
|
+
({
|
|
29
|
+
label,
|
|
30
|
+
htmlFor,
|
|
31
|
+
error,
|
|
32
|
+
errorVariant = "error",
|
|
33
|
+
errorSlot = false,
|
|
34
|
+
labelVariant = "default",
|
|
35
|
+
required = false,
|
|
36
|
+
className,
|
|
37
|
+
children
|
|
38
|
+
}, ref) => {
|
|
39
|
+
const hasChrome = label != null || error != null || errorSlot;
|
|
40
|
+
return /* @__PURE__ */ jsxs("div", { ref, className: cn(hasChrome ? "relative flex w-full flex-col" : "contents", className), children: [
|
|
41
|
+
label && // Default is text-h6, NOT text-h4: `Field` (ui/field.tsx) renders its label via
|
|
42
|
+
// `Label variant="small"` = text-h6, and every form that mixes
|
|
43
|
+
// Field-wrapped controls with `label=`-prop controls showed two label
|
|
44
|
+
// sizes side by side — the exact inconsistency the admin editors kept
|
|
45
|
+
// reporting. One label scale, owned here and in Field together.
|
|
46
|
+
/* @__PURE__ */ jsxs(Label, { className: "mb-1", htmlFor, variant: labelVariant, children: [
|
|
47
|
+
label,
|
|
48
|
+
required && /* @__PURE__ */ jsx2(RequiredMark, {})
|
|
49
|
+
] }),
|
|
50
|
+
children,
|
|
51
|
+
error && /* @__PURE__ */ jsx2(
|
|
52
|
+
"p",
|
|
53
|
+
{
|
|
54
|
+
className: cn(
|
|
55
|
+
"absolute bottom-0 left-0 right-0 translate-y-full truncate text-h6",
|
|
56
|
+
errorVariantClasses[errorVariant]
|
|
57
|
+
),
|
|
58
|
+
title: error,
|
|
59
|
+
children: error
|
|
60
|
+
}
|
|
61
|
+
)
|
|
62
|
+
] });
|
|
63
|
+
}
|
|
64
|
+
);
|
|
65
|
+
FieldWrapper.displayName = "FieldWrapper";
|
|
66
|
+
|
|
67
|
+
// src/components/ui/input.tsx
|
|
68
|
+
import { Loader2 } from "lucide-react";
|
|
69
|
+
import { forwardRef as forwardRef2 } from "react";
|
|
70
|
+
import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
71
|
+
var invalidBorderClasses = {
|
|
72
|
+
error: "border-ods-error hover:border-ods-error has-[:focus]:border-ods-error",
|
|
73
|
+
warning: "!border-ods-warning hover:!border-ods-warning has-[:focus]:!border-ods-warning"
|
|
74
|
+
};
|
|
75
|
+
var Input = forwardRef2((allProps, ref) => {
|
|
76
|
+
const {
|
|
77
|
+
className,
|
|
78
|
+
type,
|
|
79
|
+
invalid = false,
|
|
80
|
+
startAdornment,
|
|
81
|
+
endAdornment,
|
|
82
|
+
label,
|
|
83
|
+
labelVariant,
|
|
84
|
+
error,
|
|
85
|
+
errorVariant = "error",
|
|
86
|
+
loading = false,
|
|
87
|
+
...props
|
|
88
|
+
} = allProps;
|
|
89
|
+
const errorSlot = "error" in allProps;
|
|
90
|
+
const variantIsInvalid = errorVariant === "error" || errorVariant === "warning";
|
|
91
|
+
const isInvalid = invalid || !!error && variantIsInvalid;
|
|
92
|
+
if (type === "range") {
|
|
93
|
+
const rangeInput = /* @__PURE__ */ jsx3(
|
|
94
|
+
"input",
|
|
95
|
+
{
|
|
96
|
+
type: "range",
|
|
97
|
+
className: cn(
|
|
98
|
+
"h-1 w-full cursor-pointer appearance-none rounded-full bg-white/30",
|
|
99
|
+
// Webkit (Chrome/Safari) thumb
|
|
100
|
+
"[&::-webkit-slider-thumb]:appearance-none",
|
|
101
|
+
"[&::-webkit-slider-thumb]:h-3 [&::-webkit-slider-thumb]:w-3",
|
|
102
|
+
"[&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-white",
|
|
103
|
+
"[&::-webkit-slider-thumb]:cursor-pointer [&::-webkit-slider-thumb]:shadow-sm",
|
|
104
|
+
// Firefox thumb
|
|
105
|
+
"[&::-moz-range-thumb]:h-3 [&::-moz-range-thumb]:w-3",
|
|
106
|
+
"[&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:bg-white",
|
|
107
|
+
"[&::-moz-range-thumb]:cursor-pointer [&::-moz-range-thumb]:border-0",
|
|
108
|
+
// Firefox track
|
|
109
|
+
"[&::-moz-range-track]:bg-transparent",
|
|
110
|
+
// Disabled
|
|
111
|
+
"disabled:cursor-not-allowed disabled:opacity-50",
|
|
112
|
+
className
|
|
113
|
+
),
|
|
114
|
+
ref,
|
|
115
|
+
...props
|
|
116
|
+
}
|
|
117
|
+
);
|
|
118
|
+
return label ? /* @__PURE__ */ jsx3(
|
|
119
|
+
FieldWrapper,
|
|
120
|
+
{
|
|
121
|
+
label,
|
|
122
|
+
labelVariant,
|
|
123
|
+
error,
|
|
124
|
+
errorVariant,
|
|
125
|
+
errorSlot,
|
|
126
|
+
children: rangeInput
|
|
127
|
+
}
|
|
128
|
+
) : rangeInput;
|
|
129
|
+
}
|
|
130
|
+
const content = /* @__PURE__ */ jsxs2(
|
|
131
|
+
"label",
|
|
132
|
+
{
|
|
133
|
+
"data-invalid": isInvalid || void 0,
|
|
134
|
+
className: cn(
|
|
135
|
+
// Layout & spacing
|
|
136
|
+
"flex h-11 w-full cursor-text items-center gap-2 rounded-[6px] border px-3 md:h-12",
|
|
137
|
+
// Focus-within states
|
|
138
|
+
"has-[:focus-visible]:outline-none",
|
|
139
|
+
"group",
|
|
140
|
+
// Animations & touch UX
|
|
141
|
+
"transition-colors duration-200",
|
|
142
|
+
// Theme palette
|
|
143
|
+
"border-ods-border bg-ods-card has-[:focus]:border-ods-accent",
|
|
144
|
+
// Hover & active (not disabled)
|
|
145
|
+
!props.disabled && "hover:border-ods-border-hover hover:bg-ods-bg-hover active:border-ods-border-active active:bg-ods-bg-active",
|
|
146
|
+
// Disabled. The adornments (and any icon inside them) carry their own
|
|
147
|
+
// `text-ods-text-secondary`, so grey them from here — a disabled field
|
|
148
|
+
// must read as one flat colour, not grey text next to a live icon.
|
|
149
|
+
// Scoped to the DIRECT span children (the two adornment wrappers): a
|
|
150
|
+
// descendant rule would also repaint whatever the caller renders INSIDE
|
|
151
|
+
// an adornment, which is passed verbatim precisely so it can own its
|
|
152
|
+
// colour (a `Tag` there went invisible against its own fill).
|
|
153
|
+
props.disabled && "!cursor-not-allowed bg-ods-bg",
|
|
154
|
+
"has-[:disabled]:[&>span]:text-ods-text-disabled has-[:disabled]:[&_svg]:text-ods-text-disabled",
|
|
155
|
+
// Invalid
|
|
156
|
+
isInvalid && invalidBorderClasses[variantIsInvalid ? errorVariant : "error"],
|
|
157
|
+
className
|
|
158
|
+
),
|
|
159
|
+
children: [
|
|
160
|
+
startAdornment && /* @__PURE__ */ jsx3("span", { className: "flex-shrink-0 text-ods-text-secondary transition-colors duration-200 text-h6 group-has-[:focus]:text-ods-accent group-data-[invalid]:text-ods-error [&_svg]:size-4 md:[&_svg]:size-6", children: startAdornment }),
|
|
161
|
+
/* @__PURE__ */ jsx3(
|
|
162
|
+
"input",
|
|
163
|
+
{
|
|
164
|
+
type,
|
|
165
|
+
className: cn(
|
|
166
|
+
// Layout
|
|
167
|
+
"min-w-0 flex-1 border-none bg-transparent outline-none",
|
|
168
|
+
// Typography
|
|
169
|
+
"text-h4",
|
|
170
|
+
// Colors
|
|
171
|
+
"text-ods-text-primary placeholder:text-ods-text-secondary",
|
|
172
|
+
// File input adjustments
|
|
173
|
+
"file:border-0 file:bg-transparent",
|
|
174
|
+
// Disabled
|
|
175
|
+
"disabled:cursor-not-allowed disabled:text-ods-text-disabled disabled:placeholder:text-ods-border",
|
|
176
|
+
// Touch
|
|
177
|
+
"touch-manipulation",
|
|
178
|
+
// Autofill override
|
|
179
|
+
"[&:-webkit-autofill]:[-webkit-box-shadow:0_0_0_9999px_transparent_inset] [&:-webkit-autofill]:[-webkit-text-fill-color:var(--color-text-primary)] [&:-webkit-autofill]:[caret-color:var(--color-text-primary)] [&:-webkit-autofill]:[transition:background-color_9999s_ease-in-out_0s]"
|
|
180
|
+
),
|
|
181
|
+
ref,
|
|
182
|
+
...props
|
|
183
|
+
}
|
|
184
|
+
),
|
|
185
|
+
loading && /* @__PURE__ */ jsx3(Loader2, { className: "size-4 flex-shrink-0 animate-spin text-ods-text-secondary md:size-6" }),
|
|
186
|
+
!loading && endAdornment && /* @__PURE__ */ jsx3("span", { className: "flex-shrink-0 text-ods-text-secondary transition-colors duration-200 text-h6 group-has-[:focus]:text-ods-accent group-data-[invalid]:text-ods-error [&_svg]:size-4 md:[&_svg]:size-6", children: endAdornment })
|
|
187
|
+
]
|
|
188
|
+
}
|
|
189
|
+
);
|
|
190
|
+
return /* @__PURE__ */ jsx3(
|
|
191
|
+
FieldWrapper,
|
|
192
|
+
{
|
|
193
|
+
label,
|
|
194
|
+
labelVariant,
|
|
195
|
+
error,
|
|
196
|
+
errorVariant,
|
|
197
|
+
errorSlot,
|
|
198
|
+
children: content
|
|
199
|
+
}
|
|
200
|
+
);
|
|
201
|
+
});
|
|
202
|
+
Input.displayName = "Input";
|
|
203
|
+
|
|
204
|
+
// src/components/ui/checkbox.tsx
|
|
205
|
+
import * as CheckboxPrimitive from "@radix-ui/react-checkbox";
|
|
206
|
+
import { forwardRef as forwardRef3 } from "react";
|
|
207
|
+
import { jsx as jsx4 } from "react/jsx-runtime";
|
|
208
|
+
var Checkbox = forwardRef3(({ className, ...props }, ref) => /* @__PURE__ */ jsx4(
|
|
209
|
+
CheckboxPrimitive.Root,
|
|
210
|
+
{
|
|
211
|
+
ref,
|
|
212
|
+
className: cn(
|
|
213
|
+
"peer h-4 w-4 shrink-0 rounded-sm border border-ods-border bg-ods-card focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ods-accent focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-ods-accent data-[state=checked]:bg-ods-accent",
|
|
214
|
+
className
|
|
215
|
+
),
|
|
216
|
+
...props,
|
|
217
|
+
children: /* @__PURE__ */ jsx4(CheckboxPrimitive.Indicator, { className: cn("flex items-center justify-center text-ods-text-on-accent"), children: /* @__PURE__ */ jsx4(CheckboxCheckmarkIcon, { size: 10 }) })
|
|
218
|
+
}
|
|
219
|
+
));
|
|
220
|
+
Checkbox.displayName = CheckboxPrimitive.Root.displayName;
|
|
221
|
+
|
|
222
|
+
export {
|
|
223
|
+
RequiredMark,
|
|
224
|
+
FieldWrapper,
|
|
225
|
+
Input,
|
|
226
|
+
Checkbox
|
|
227
|
+
};
|
|
228
|
+
//# sourceMappingURL=chunk-BXWXBBAC.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ui/required-mark.tsx","../src/components/ui/field-wrapper.tsx","../src/components/ui/input.tsx","../src/components/ui/checkbox.tsx"],"sourcesContent":["/**\n * The design system's required-field mark: an accent asterisk after the label.\n * `aria-hidden` on purpose — the CONTROL carries `required`/`aria-required` for\n * assistive tech; the star is only the visual. ONE owner, used by `Field`,\n * `FieldWrapper` and every form that marks its own labels.\n */\nexport function RequiredMark() {\n return (\n <span aria-hidden className=\"text-ods-accent\">\n *\n </span>\n );\n}\n","'use client';\n\nimport { type ReactNode, forwardRef } from 'react';\nimport { cn } from '../../utils/cn';\nimport { Label } from './label';\nimport { RequiredMark } from './required-mark';\n\nexport interface FieldWrapperProps {\n /** Label text displayed above the field */\n label?: string;\n /**\n * `id` of the control the label names. Without it the label is decoration:\n * clicking it focuses nothing and assistive tech reads the field unnamed,\n * which is why every caller that cared was rendering its own <Label> instead\n * of using `label` here.\n */\n htmlFor?: string;\n /**\n * Status message displayed below the field, on ONE line, ellipsized on\n * overflow (full text via the native `title`).\n *\n * It is positioned OUT OF FLOW (absolute, hanging below the wrapper), so it\n * never changes the field's height when it appears — the same treatment\n * `CheckboxBlock` uses. That holds only while the wrapper is already a box\n * when the message arrives — see `errorSlot`. The trade is that it overlaps whatever sits directly\n * below: a form stacking fields needs at least ~20px of vertical gap (e.g.\n * `gap-[var(--spacing-system-lf)]`) for the message to land in clear space.\n */\n error?: string;\n /** Color variant for the message: \"error\" (red), \"warning\" (yellow), \"success\" (green) or \"muted\" (grey) */\n errorVariant?: 'error' | 'warning' | 'success' | 'muted';\n /**\n * The field is wired for a message: `error` may arrive later, so render the\n * positioned box from the FIRST render instead of only once it does.\n *\n * Without a label the wrapper is `display: contents` while `error` is empty\n * and a box once it is set — and the parent's spacing lands on a box but not\n * on `contents`: a `space-y-*` margin, a flex row's sizing. So the control\n * moved by that spacing the moment a message came, and back when it went.\n * The controls pass this whenever the caller wrote an `error` attribute at\n * all (`error={undefined}` included): those are exactly the call sites whose\n * layout could flip, and a box there is the layout they already got on error.\n */\n errorSlot?: boolean;\n /**\n * Label scale. Default is the standard form-label scale (text-h6).\n * 'large' (text-h4) is for screens whose design specifies body-scale field\n * titles (e.g. the devices New Device page) — opt in per call site, the\n * default stays the converged small scale.\n */\n labelVariant?: 'default' | 'large';\n /**\n * Marks the label with the `RequiredMark` `ContactForm` draws on its required\n * fields, so a form mixing both never shows two conventions. Visual only — the\n * CONTROL carries `required`/`aria-required` for assistive tech; the star is\n * `aria-hidden`.\n */\n required?: boolean;\n /** Additional className for the outer wrapper */\n className?: string;\n children: ReactNode;\n}\n\nconst errorVariantClasses = {\n error: 'text-ods-error',\n warning: 'text-ods-warning',\n success: 'text-ods-success',\n muted: 'text-ods-text-secondary',\n} as const;\n\nconst FieldWrapper = forwardRef<HTMLDivElement, FieldWrapperProps>(\n (\n {\n label,\n htmlFor,\n error,\n errorVariant = 'error',\n errorSlot = false,\n labelVariant = 'default',\n required = false,\n className,\n children,\n },\n ref,\n ) => {\n const hasChrome = label != null || error != null || errorSlot;\n\n return (\n <div ref={ref} className={cn(hasChrome ? 'relative flex w-full flex-col' : 'contents', className)}>\n {label && (\n // Default is text-h6, NOT text-h4: `Field` (ui/field.tsx) renders its label via\n // `Label variant=\"small\"` = text-h6, and every form that mixes\n // Field-wrapped controls with `label=`-prop controls showed two label\n // sizes side by side — the exact inconsistency the admin editors kept\n // reporting. One label scale, owned here and in Field together.\n <Label className=\"mb-1\" htmlFor={htmlFor} variant={labelVariant}>\n {label}\n {required && <RequiredMark />}\n </Label>\n )}\n {children}\n {error && (\n <p\n className={cn(\n 'absolute bottom-0 left-0 right-0 translate-y-full truncate text-h6',\n errorVariantClasses[errorVariant],\n )}\n title={error}\n >\n {error}\n </p>\n )}\n </div>\n );\n },\n);\nFieldWrapper.displayName = 'FieldWrapper';\n\nexport { FieldWrapper };\n","'use client';\n\nimport { Loader2 } from 'lucide-react';\nimport { type InputHTMLAttributes, type ReactNode, forwardRef } from 'react';\nimport { cn } from '../../utils/cn';\nimport { FieldWrapper } from './field-wrapper';\n\nexport interface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n /** When true, renders error border & ring */\n invalid?: boolean;\n /** Element displayed at the start (left) of the input */\n startAdornment?: ReactNode;\n /** Element displayed at the end (right) of the input */\n endAdornment?: ReactNode;\n /** Label text displayed above the input */\n label?: string;\n /** Label scale forwarded to FieldWrapper ('large' = text-h4 for designs with body-scale field titles) */\n labelVariant?: 'default' | 'large';\n /** Status message displayed below the input */\n error?: string;\n /** Color variant for the message: \"error\" (red), \"warning\" (yellow), \"success\" (green) or \"muted\" (grey).\n Only \"error\" and \"warning\" mark the field invalid (colored border). */\n errorVariant?: 'error' | 'warning' | 'success' | 'muted';\n /** When true, shows a loading spinner as end adornment */\n loading?: boolean;\n}\n\nconst invalidBorderClasses = {\n error: 'border-ods-error hover:border-ods-error has-[:focus]:border-ods-error',\n warning: '!border-ods-warning hover:!border-ods-warning has-[:focus]:!border-ods-warning',\n} as const;\n\nconst Input = forwardRef<HTMLInputElement, InputProps>((allProps, ref) => {\n const {\n className,\n type,\n invalid = false,\n startAdornment,\n endAdornment,\n label,\n labelVariant,\n error,\n errorVariant = 'error',\n loading = false,\n ...props\n } = allProps;\n // Wired for a message even while `error` is undefined — see `FieldWrapper.errorSlot`.\n const errorSlot = 'error' in allProps;\n // success/muted are informational — they never paint the invalid border\n const variantIsInvalid = errorVariant === 'error' || errorVariant === 'warning';\n const isInvalid = invalid || (!!error && variantIsInvalid);\n\n // Range inputs get a clean slider rendering — no label wrapper, borders, or adornments\n if (type === 'range') {\n const rangeInput = (\n <input\n type=\"range\"\n className={cn(\n 'h-1 w-full cursor-pointer appearance-none rounded-full bg-white/30',\n // Webkit (Chrome/Safari) thumb\n '[&::-webkit-slider-thumb]:appearance-none',\n '[&::-webkit-slider-thumb]:h-3 [&::-webkit-slider-thumb]:w-3',\n '[&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:bg-white',\n '[&::-webkit-slider-thumb]:cursor-pointer [&::-webkit-slider-thumb]:shadow-sm',\n // Firefox thumb\n '[&::-moz-range-thumb]:h-3 [&::-moz-range-thumb]:w-3',\n '[&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:bg-white',\n '[&::-moz-range-thumb]:cursor-pointer [&::-moz-range-thumb]:border-0',\n // Firefox track\n '[&::-moz-range-track]:bg-transparent',\n // Disabled\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n return label ? (\n <FieldWrapper\n label={label}\n labelVariant={labelVariant}\n error={error}\n errorVariant={errorVariant}\n errorSlot={errorSlot}\n >\n {rangeInput}\n </FieldWrapper>\n ) : (\n rangeInput\n );\n }\n\n const content = (\n <label\n data-invalid={isInvalid || undefined}\n className={cn(\n // Layout & spacing\n 'flex h-11 w-full cursor-text items-center gap-2 rounded-[6px] border px-3 md:h-12',\n // Focus-within states\n 'has-[:focus-visible]:outline-none',\n 'group',\n // Animations & touch UX\n 'transition-colors duration-200',\n // Theme palette\n 'border-ods-border bg-ods-card has-[:focus]:border-ods-accent',\n // Hover & active (not disabled)\n !props.disabled &&\n 'hover:border-ods-border-hover hover:bg-ods-bg-hover active:border-ods-border-active active:bg-ods-bg-active',\n // Disabled. The adornments (and any icon inside them) carry their own\n // `text-ods-text-secondary`, so grey them from here — a disabled field\n // must read as one flat colour, not grey text next to a live icon.\n // Scoped to the DIRECT span children (the two adornment wrappers): a\n // descendant rule would also repaint whatever the caller renders INSIDE\n // an adornment, which is passed verbatim precisely so it can own its\n // colour (a `Tag` there went invisible against its own fill).\n props.disabled && '!cursor-not-allowed bg-ods-bg',\n 'has-[:disabled]:[&>span]:text-ods-text-disabled has-[:disabled]:[&_svg]:text-ods-text-disabled',\n // Invalid\n isInvalid && invalidBorderClasses[variantIsInvalid ? errorVariant : 'error'],\n className,\n )}\n >\n {startAdornment && (\n <span className=\"flex-shrink-0 text-ods-text-secondary transition-colors duration-200 text-h6 group-has-[:focus]:text-ods-accent group-data-[invalid]:text-ods-error [&_svg]:size-4 md:[&_svg]:size-6\">\n {startAdornment}\n </span>\n )}\n <input\n type={type}\n className={cn(\n // Layout\n 'min-w-0 flex-1 border-none bg-transparent outline-none',\n // Typography\n 'text-h4',\n // Colors\n 'text-ods-text-primary placeholder:text-ods-text-secondary',\n // File input adjustments\n 'file:border-0 file:bg-transparent',\n // Disabled\n 'disabled:cursor-not-allowed disabled:text-ods-text-disabled disabled:placeholder:text-ods-border',\n // Touch\n 'touch-manipulation',\n // Autofill override\n '[&:-webkit-autofill]:[-webkit-box-shadow:0_0_0_9999px_transparent_inset] [&:-webkit-autofill]:[-webkit-text-fill-color:var(--color-text-primary)] [&:-webkit-autofill]:[caret-color:var(--color-text-primary)] [&:-webkit-autofill]:[transition:background-color_9999s_ease-in-out_0s]',\n )}\n ref={ref}\n {...props}\n />\n {loading && <Loader2 className=\"size-4 flex-shrink-0 animate-spin text-ods-text-secondary md:size-6\" />}\n {!loading && endAdornment && (\n <span className=\"flex-shrink-0 text-ods-text-secondary transition-colors duration-200 text-h6 group-has-[:focus]:text-ods-accent group-data-[invalid]:text-ods-error [&_svg]:size-4 md:[&_svg]:size-6\">\n {endAdornment}\n </span>\n )}\n </label>\n );\n\n return (\n <FieldWrapper\n label={label}\n labelVariant={labelVariant}\n error={error}\n errorVariant={errorVariant}\n errorSlot={errorSlot}\n >\n {content}\n </FieldWrapper>\n );\n});\nInput.displayName = 'Input';\n\nexport { Input };\n","'use client';\n\nimport * as CheckboxPrimitive from '@radix-ui/react-checkbox';\nimport { type ComponentPropsWithoutRef, type ElementRef, forwardRef } from 'react';\n\nimport { cn } from '../../utils/cn';\nimport { CheckboxCheckmarkIcon } from '../icons-v2-generated/signs-and-symbols/checkbox-checkmark-icon';\n\nconst Checkbox = forwardRef<\n ElementRef<typeof CheckboxPrimitive.Root>,\n ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n className={cn(\n 'peer h-4 w-4 shrink-0 rounded-sm border border-ods-border bg-ods-card focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ods-accent focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-ods-accent data-[state=checked]:bg-ods-accent',\n className,\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator className={cn('flex items-center justify-center text-ods-text-on-accent')}>\n <CheckboxCheckmarkIcon size={10} />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n));\nCheckbox.displayName = CheckboxPrimitive.Root.displayName;\n\nexport { Checkbox };\n"],"mappings":"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","names":["jsx","forwardRef","jsx","jsxs","forwardRef","forwardRef","jsx","forwardRef"]}
|