@epicbagel/saas-kit 1.33.0 → 1.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +67 -0
- package/dist/chunk-2BNEE3U6.cjs +36 -0
- package/dist/{chunk-KOR2QR7I.cjs → chunk-2YW5VA2V.cjs} +5 -5
- package/dist/chunk-5PHOKJCT.cjs +42 -0
- package/dist/chunk-BB7PO2BW.js +67 -0
- package/dist/{chunk-PTMZTP3V.cjs → chunk-BGCNGYPL.cjs} +2 -2
- package/dist/chunk-BOMVE7QO.cjs +47 -0
- package/dist/{chunk-FPOJ2NGG.js → chunk-C3VZMTVB.js} +1 -1
- package/dist/chunk-EXHF3QUY.js +36 -0
- package/dist/chunk-FYNHRHVY.cjs +47 -0
- package/dist/{chunk-AWCXVYPL.js → chunk-HTPPNW74.js} +1 -1
- package/dist/{chunk-REGA2L5S.js → chunk-HTUYUMAH.js} +3 -3
- package/dist/chunk-I3GBXIFL.cjs +67 -0
- package/dist/{chunk-SL6ECEN6.cjs → chunk-JMNDFISN.cjs} +3 -3
- package/dist/{chunk-TS4MC3B3.js → chunk-NNEV5RHQ.js} +6 -6
- package/dist/chunk-O3G3TVPU.js +27 -0
- package/dist/{chunk-IZF4WCK6.js → chunk-ROUWBWEQ.js} +5 -5
- package/dist/chunk-TDCVZKMX.cjs +27 -0
- package/dist/{chunk-E2UVQXBO.cjs → chunk-TP74SBRH.cjs} +6 -6
- package/dist/{chunk-F3D5HA2F.cjs → chunk-VUMLLKWY.cjs} +8 -8
- package/dist/chunk-W5L6LQI3.js +42 -0
- package/dist/chunk-WMTCL463.js +47 -0
- package/dist/chunk-WTVL2FK7.js +47 -0
- package/dist/primitives/accent-theme.cjs +4 -63
- package/dist/primitives/accent-theme.js +3 -62
- package/dist/primitives/activity-feed.cjs +4 -4
- package/dist/primitives/activity-feed.js +5 -5
- package/dist/primitives/agent-audio-visualizer-bar.cjs +3 -3
- package/dist/primitives/agent-audio-visualizer-bar.js +2 -2
- package/dist/primitives/alert.d.cts +1 -1
- package/dist/primitives/alert.d.ts +1 -1
- package/dist/primitives/anchor.cjs +3 -30
- package/dist/primitives/anchor.js +3 -30
- package/dist/primitives/app-layout.cjs +5 -5
- package/dist/primitives/app-layout.js +2 -2
- package/dist/primitives/app-sidebar.cjs +3 -3
- package/dist/primitives/app-sidebar.js +2 -2
- package/dist/primitives/archive-confirmation-dialog.cjs +2 -2
- package/dist/primitives/archive-confirmation-dialog.js +3 -3
- package/dist/primitives/badge.d.cts +1 -1
- package/dist/primitives/badge.d.ts +1 -1
- package/dist/primitives/board-view-internals.cjs +3 -3
- package/dist/primitives/board-view-internals.js +2 -2
- package/dist/primitives/board-view.cjs +8 -8
- package/dist/primitives/board-view.js +7 -7
- package/dist/primitives/brand-mark.cjs +3 -21
- package/dist/primitives/brand-mark.js +3 -21
- package/dist/primitives/branded-page.cjs +201 -0
- package/dist/primitives/branded-page.d.cts +118 -0
- package/dist/primitives/branded-page.d.ts +118 -0
- package/dist/primitives/branded-page.js +201 -0
- package/dist/primitives/bubble.d.cts +1 -1
- package/dist/primitives/bubble.d.ts +1 -1
- package/dist/primitives/button.d.cts +2 -2
- package/dist/primitives/button.d.ts +2 -2
- package/dist/primitives/call-card.cjs +2 -2
- package/dist/primitives/call-card.js +3 -3
- package/dist/primitives/chat.cjs +25 -25
- package/dist/primitives/chat.js +22 -22
- package/dist/primitives/code-block.cjs +4 -4
- package/dist/primitives/code-block.js +3 -3
- package/dist/primitives/command.d.cts +1 -1
- package/dist/primitives/command.d.ts +1 -1
- package/dist/primitives/connection.cjs +5 -5
- package/dist/primitives/connection.js +7 -7
- package/dist/primitives/copy-button.cjs +3 -3
- package/dist/primitives/copy-button.js +2 -2
- package/dist/primitives/document-preview.cjs +5 -5
- package/dist/primitives/document-preview.js +3 -3
- package/dist/primitives/file-preview-internals.cjs +4 -4
- package/dist/primitives/file-preview-internals.js +3 -3
- package/dist/primitives/file-preview.cjs +16 -16
- package/dist/primitives/file-preview.js +6 -6
- package/dist/primitives/filter-bar.cjs +4 -4
- package/dist/primitives/filter-bar.js +3 -3
- package/dist/primitives/fixed-action-bar.cjs +4 -41
- package/dist/primitives/fixed-action-bar.js +4 -41
- package/dist/primitives/marketing-header.cjs +3 -36
- package/dist/primitives/marketing-header.js +3 -36
- package/dist/primitives/notes.cjs +7 -7
- package/dist/primitives/notes.js +7 -7
- package/dist/primitives/page-shell.cjs +3 -41
- package/dist/primitives/page-shell.js +3 -41
- package/dist/primitives/resource-list.cjs +8 -8
- package/dist/primitives/resource-list.js +7 -7
- package/dist/primitives/responsive-dialog.cjs +3 -3
- package/dist/primitives/responsive-dialog.js +2 -2
- package/dist/primitives/section.cjs +2 -2
- package/dist/primitives/section.js +3 -3
- package/dist/primitives/switch-field.cjs +3 -3
- package/dist/primitives/switch-field.js +3 -3
- package/dist/primitives/tabbed-page-header.cjs +3 -3
- package/dist/primitives/tabbed-page-header.js +3 -3
- package/dist/primitives/theme-selector.cjs +3 -3
- package/dist/primitives/theme-selector.js +4 -4
- package/dist/primitives/voice-dictation-button.cjs +5 -5
- package/dist/primitives/voice-dictation-button.js +4 -4
- package/dist/primitives/voice-session-controls.cjs +4 -4
- package/dist/primitives/voice-session-controls.js +3 -3
- package/dist/primitives/workflow-assistant.cjs +5 -5
- package/dist/primitives/workflow-assistant.js +3 -3
- package/package.json +11 -1
- package/dist/{chunk-2FVFPGP5.js → chunk-5GFMSK27.js} +3 -3
- package/dist/{chunk-4TJBXXUE.js → chunk-5OF6D3GH.js} +3 -3
- package/dist/{chunk-ULZB4A2I.js → chunk-62UTAG2C.js} +3 -3
- package/dist/{chunk-SW4T3O7M.js → chunk-6LB37JWO.js} +6 -6
- package/dist/{chunk-AO56ET4F.cjs → chunk-BTHYGHOH.cjs} +2 -2
- package/dist/{chunk-7ZRFXJVN.js → chunk-DILYV4FI.js} +3 -3
- package/dist/{chunk-HHF5DEKM.cjs → chunk-FARCLWLU.cjs} +3 -3
- package/dist/{chunk-CRZ4INEJ.js → chunk-JTI4244T.js} +10 -10
- package/dist/{chunk-FB3VY2PL.cjs → chunk-NKWHDI4C.cjs} +2 -2
- package/dist/{chunk-GUVQAWUW.cjs → chunk-S2IMM37Q.cjs} +5 -5
- package/dist/{chunk-G3SF4RRA.cjs → chunk-UKYUWSF2.cjs} +3 -3
- package/dist/{chunk-D46FNEZ5.cjs → chunk-YYFVG5A6.cjs} +2 -2
package/README.md
CHANGED
|
@@ -514,6 +514,73 @@ export function Appearance() {
|
|
|
514
514
|
`paletteDescription`. Each palette's card is named by its `label` and
|
|
515
515
|
described by its `description`.
|
|
516
516
|
|
|
517
|
+
## Branded page (1.34.0)
|
|
518
|
+
|
|
519
|
+
`primitives/branded-page` is the whole of a public page one company shows to
|
|
520
|
+
another company's people: a shared profile, a list sent for review, an
|
|
521
|
+
invitation, a client's portal. It puts the kit's page chrome together
|
|
522
|
+
(`MarketingHeader`, `BrandMark`, `AccentTheme`, `PageShell`,
|
|
523
|
+
`FixedActionBar` and `EmptyState`), so a host passes a brand and its content.
|
|
524
|
+
|
|
525
|
+
```tsx
|
|
526
|
+
import { BrandedPage } from "@epicbagel/saas-kit/primitives/branded-page";
|
|
527
|
+
|
|
528
|
+
<BrandedPage
|
|
529
|
+
brand={{ name: "Example Agency", logoUrl: brand.logoUrl, href: brand.website }}
|
|
530
|
+
accent={{ light: "#0f766e", dark: "#5eead4" }}
|
|
531
|
+
headerTrailing={<ThemeSwitch />} // your own control
|
|
532
|
+
credit="Shared by Example Agency"
|
|
533
|
+
actionBar={{
|
|
534
|
+
title: "Three people ready",
|
|
535
|
+
description: "Book a call to meet them.",
|
|
536
|
+
actions: <Button size="lg">Book a call</Button>,
|
|
537
|
+
}}
|
|
538
|
+
loading={loading}
|
|
539
|
+
unavailable={gone ? { reason: "expired" } : false}
|
|
540
|
+
>
|
|
541
|
+
<Profile />
|
|
542
|
+
</BrandedPage>
|
|
543
|
+
```
|
|
544
|
+
|
|
545
|
+
- **Brand.** The logo (`logoUrl`), else the `name` as text, and a link when
|
|
546
|
+
it has an `href`; nothing for a brand with neither. Or pass an element of
|
|
547
|
+
your own: your wordmark, or your router's link around one. The name is
|
|
548
|
+
text, not a heading, so the page's headings start in its content. A logo's
|
|
549
|
+
text alternative is `logoAlt`, else the brand's `name`, else "Logo".
|
|
550
|
+
- **Accent and palette.** `accent` is the brand's light and dark colours as
|
|
551
|
+
six-digit hex, which `AccentTheme` applies inside the page only. `palette`
|
|
552
|
+
pins the page to one palette (its `data-theme` value) and paints the
|
|
553
|
+
canvas in it, so the page looks the same to every visitor whatever palette
|
|
554
|
+
their own browser has stored. Left out, the page follows the document.
|
|
555
|
+
- **Header.** `headerTrailing` holds your own controls, such as a theme
|
|
556
|
+
switch or Sign in. The header is the page's banner; with neither a brand
|
|
557
|
+
nor controls there is none.
|
|
558
|
+
- **Content.** `children`, in the page's one `main`: `width` (`narrow` by
|
|
559
|
+
default, `wide` or `full`), `padding` (`base` by default, which lines up
|
|
560
|
+
with the header) and `surface` (`muted` by default, or `default`).
|
|
561
|
+
- **Credit.** `credit` is a closing line under the content. It prints;
|
|
562
|
+
`creditPrintVisibility="hidden"` keeps it off paper.
|
|
563
|
+
- **Action bar.** `actionBar` is a `FixedActionBar` as wide as the content:
|
|
564
|
+
`title`, `description`, `actions` and `actionsWidth`. The content keeps
|
|
565
|
+
clear of it.
|
|
566
|
+
- **States.** `loading` and `unavailable` stand in for the content, the
|
|
567
|
+
credit and the action bar, under the same header and both starting at the
|
|
568
|
+
same height: pass `true`, or the state's props. `loading` wins while both
|
|
569
|
+
are set. `unavailable` takes a `reason` (`not-found` by default, worded
|
|
570
|
+
for a link whose fate you can't tell; `expired`, `archived` or `revoked`),
|
|
571
|
+
each with its own icon and words, and your `icon`, `title`, `description`
|
|
572
|
+
and `action` in their place. Its title is a heading, and it is announced
|
|
573
|
+
when it appears (`role="alert"`). Loading is a polite `role="status"`
|
|
574
|
+
under a `label` ("Loading…").
|
|
575
|
+
- **Alone.** `BrandedPageUnavailable` and `BrandedPageLoading` are the same
|
|
576
|
+
two states as blocks, for a frame you draw yourself. With no brand to
|
|
577
|
+
show, `<BrandedPage unavailable />` is the whole page, without a header.
|
|
578
|
+
- **Paper.** Printed, the canvas is plain and the spacing compact, and the
|
|
579
|
+
header's controls and the action bar are left off.
|
|
580
|
+
- **Presentation only.** No router, fetch or storage: the host decides which
|
|
581
|
+
state shows, and every word can be replaced. The action bar's accessible
|
|
582
|
+
name ("Page action") is `FixedActionBar`'s own.
|
|
583
|
+
|
|
517
584
|
## License
|
|
518
585
|
|
|
519
586
|
MIT. Some components and styles are adapted from shadcn/ui, and the file
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
var _chunkKWLSBTB2cjs = require('./chunk-KWLSBTB2.cjs');
|
|
5
|
+
|
|
6
|
+
// src/primitives/anchor.tsx
|
|
7
|
+
var _reactslot = require('@radix-ui/react-slot');
|
|
8
|
+
var _react = require('react');
|
|
9
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
10
|
+
var Anchor = _react.forwardRef.call(void 0, function Anchor2({ variant = "unstyled", size = "inherit", display = "inline", underline = false, asChild = false, border = "none", weight = "normal", className, ...props }, ref) {
|
|
11
|
+
const Component = asChild ? _reactslot.Slot : "a";
|
|
12
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
13
|
+
Component,
|
|
14
|
+
{
|
|
15
|
+
ref,
|
|
16
|
+
className: _chunkKWLSBTB2cjs.cn.call(void 0,
|
|
17
|
+
variant === "text" && "font-medium text-primary underline-offset-4 hover:underline",
|
|
18
|
+
variant === "muted" && "text-muted-foreground underline underline-offset-2 hover:text-foreground",
|
|
19
|
+
variant === "foreground" && "text-foreground underline-offset-2 hover:underline",
|
|
20
|
+
size === "xs" && "text-xs",
|
|
21
|
+
size === "sm" && "text-sm",
|
|
22
|
+
display === "inline-flex" && "inline-flex items-center gap-1",
|
|
23
|
+
display === "block" && "block",
|
|
24
|
+
border === "bottom" && "border-b last:border-b-0",
|
|
25
|
+
weight === "medium" && "font-medium",
|
|
26
|
+
underline && "underline",
|
|
27
|
+
className
|
|
28
|
+
),
|
|
29
|
+
...props
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
exports.Anchor = Anchor;
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } 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 _chunkJDEXZGIYcjs = require('./chunk-JDEXZGIY.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
var
|
|
7
|
+
var _chunkNKWHDI4Ccjs = require('./chunk-NKWHDI4C.cjs');
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _chunkKWLSBTB2cjs = require('./chunk-KWLSBTB2.cjs');
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
var
|
|
13
|
+
var _chunk7Q4EFCUIcjs = require('./chunk-7Q4EFCUI.cjs');
|
|
14
14
|
|
|
15
15
|
// src/primitives/voice-dictation-button.tsx
|
|
16
16
|
|
|
@@ -269,7 +269,7 @@ var silence = () => SILENCE;
|
|
|
269
269
|
function DictationWaveform({ source, state }) {
|
|
270
270
|
const bands = _react.useSyncExternalStore.call(void 0, source.subscribe, source.getSnapshot, silence);
|
|
271
271
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
272
|
-
|
|
272
|
+
_chunkNKWHDI4Ccjs.AgentAudioVisualizerBar,
|
|
273
273
|
{
|
|
274
274
|
"aria-hidden": "true",
|
|
275
275
|
"data-slot": "dictation-waveform",
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
var _chunkKWLSBTB2cjs = require('./chunk-KWLSBTB2.cjs');
|
|
5
|
+
|
|
6
|
+
// src/primitives/marketing-header.tsx
|
|
7
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
8
|
+
function MarketingHeader({
|
|
9
|
+
brand,
|
|
10
|
+
links = [],
|
|
11
|
+
trailing,
|
|
12
|
+
renderLink,
|
|
13
|
+
variant = "default",
|
|
14
|
+
className
|
|
15
|
+
}) {
|
|
16
|
+
const link = (l) => {
|
|
17
|
+
const cls = variant === "mono" ? "font-mono text-xs uppercase tracking-[0.18em] text-muted-foreground transition-colors hover:text-foreground" : "text-sm text-muted-foreground transition-colors hover:text-foreground";
|
|
18
|
+
if (renderLink)
|
|
19
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children: renderLink({ href: l.href, children: l.label, className: cls }) }, l.href);
|
|
20
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "a", { href: l.href, className: cls, children: l.label }, l.href);
|
|
21
|
+
};
|
|
22
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
23
|
+
"header",
|
|
24
|
+
{
|
|
25
|
+
className: _chunkKWLSBTB2cjs.cn.call(void 0,
|
|
26
|
+
"sticky top-0 z-50 border-b border-border bg-background/80 backdrop-blur-sm supports-[backdrop-filter]:bg-background/70",
|
|
27
|
+
className
|
|
28
|
+
),
|
|
29
|
+
children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mx-auto flex w-full max-w-5xl items-center justify-between px-4 py-4 md:px-6", children: [
|
|
30
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex items-center", children: brand }),
|
|
31
|
+
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "nav", { className: "flex items-center gap-3 md:gap-5", children: [
|
|
32
|
+
links.length > 0 && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "hidden items-center gap-5 sm:flex", children: links.map(link) }),
|
|
33
|
+
trailing && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex items-center gap-2 md:gap-3", children: trailing })
|
|
34
|
+
] })
|
|
35
|
+
] })
|
|
36
|
+
}
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
exports.MarketingHeader = MarketingHeader;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/primitives/accent-theme.tsx
|
|
4
|
+
import { useId } from "react";
|
|
5
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
var PALETTE_ID = /^[A-Za-z0-9_-]+$/;
|
|
7
|
+
function hexToHslTriplet(hex) {
|
|
8
|
+
const match = /^#([0-9a-f]{6})$/i.exec(hex.trim());
|
|
9
|
+
if (!match) return null;
|
|
10
|
+
const value = Number.parseInt(match[1], 16);
|
|
11
|
+
const red = (value >> 16 & 255) / 255;
|
|
12
|
+
const green = (value >> 8 & 255) / 255;
|
|
13
|
+
const blue = (value & 255) / 255;
|
|
14
|
+
const maximum = Math.max(red, green, blue);
|
|
15
|
+
const minimum = Math.min(red, green, blue);
|
|
16
|
+
const lightness = (maximum + minimum) / 2;
|
|
17
|
+
let hue = 0;
|
|
18
|
+
let saturation = 0;
|
|
19
|
+
if (maximum !== minimum) {
|
|
20
|
+
const delta = maximum - minimum;
|
|
21
|
+
saturation = lightness > 0.5 ? delta / (2 - maximum - minimum) : delta / (maximum + minimum);
|
|
22
|
+
if (maximum === red) hue = ((green - blue) / delta + (green < blue ? 6 : 0)) / 6;
|
|
23
|
+
else if (maximum === green) hue = ((blue - red) / delta + 2) / 6;
|
|
24
|
+
else hue = ((red - green) / delta + 4) / 6;
|
|
25
|
+
}
|
|
26
|
+
const round = (number) => Math.round(number * 10) / 10;
|
|
27
|
+
return `${round(hue * 360)} ${round(saturation * 100)}% ${round(lightness * 100)}%`;
|
|
28
|
+
}
|
|
29
|
+
function foregroundFor(hex) {
|
|
30
|
+
const match = /^#([0-9a-f]{6})$/i.exec(hex.trim());
|
|
31
|
+
if (!match) return "0 0% 100%";
|
|
32
|
+
const value = Number.parseInt(match[1], 16);
|
|
33
|
+
const channel = (number) => {
|
|
34
|
+
const normalized = number / 255;
|
|
35
|
+
return normalized <= 0.03928 ? normalized / 12.92 : ((normalized + 0.055) / 1.055) ** 2.4;
|
|
36
|
+
};
|
|
37
|
+
const luminance = 0.2126 * channel(value >> 16 & 255) + 0.7152 * channel(value >> 8 & 255) + 0.0722 * channel(value & 255);
|
|
38
|
+
return luminance > 0.45 ? "0 0% 9%" : "0 0% 100%";
|
|
39
|
+
}
|
|
40
|
+
function AccentTheme({ colours, palette, scope: target = "region", children }) {
|
|
41
|
+
const scope = `accent-${useId().replace(/[^a-zA-Z0-9]/g, "")}`;
|
|
42
|
+
const light = colours?.light ? hexToHslTriplet(colours.light) : null;
|
|
43
|
+
const dark = colours?.dark ? hexToHslTriplet(colours.dark) : null;
|
|
44
|
+
if (!light && !dark) return /* @__PURE__ */ jsx(Fragment, { children });
|
|
45
|
+
const root = palette === void 0 ? null : PALETTE_ID.test(palette) ? `:root[data-theme="${palette}"]` : ":root:not(*)";
|
|
46
|
+
const lightSelector = target === "document" ? root ?? ":root" : root ? `${root} .${scope}` : `.${scope}`;
|
|
47
|
+
const darkSelector = `${root ?? ":root"}.dark${target === "document" ? "" : ` .${scope}`}`;
|
|
48
|
+
const rules = [];
|
|
49
|
+
if (light && colours?.light) {
|
|
50
|
+
rules.push(
|
|
51
|
+
`${lightSelector}{--primary:${light};--primary-foreground:${foregroundFor(colours.light)};--ring:${light};--color-primary:hsl(var(--primary));--color-primary-foreground:hsl(var(--primary-foreground));--color-ring:hsl(var(--ring));}`
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
if (dark && colours?.dark) {
|
|
55
|
+
rules.push(
|
|
56
|
+
`${darkSelector}{--primary:${dark};--primary-foreground:${foregroundFor(colours.dark)};--ring:${dark};--color-primary:hsl(var(--primary));--color-primary-foreground:hsl(var(--primary-foreground));--color-ring:hsl(var(--ring));}`
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
60
|
+
/* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: rules.join("") } }),
|
|
61
|
+
target === "document" ? children : /* @__PURE__ */ jsx("div", { className: scope, children })
|
|
62
|
+
] });
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export {
|
|
66
|
+
AccentTheme
|
|
67
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkFARCLWLUcjs = require('./chunk-FARCLWLU.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
var _chunkKWLSBTB2cjs = require('./chunk-KWLSBTB2.cjs');
|
|
@@ -38,7 +38,7 @@ function CodeBlock({
|
|
|
38
38
|
}
|
|
39
39
|
),
|
|
40
40
|
copy ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
41
|
-
|
|
41
|
+
_chunkFARCLWLUcjs.CopyButton,
|
|
42
42
|
{
|
|
43
43
|
text: copyText,
|
|
44
44
|
label: copyLabel,
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
var _chunk373W6VADcjs = require('./chunk-373W6VAD.cjs');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
var _chunkKWLSBTB2cjs = require('./chunk-KWLSBTB2.cjs');
|
|
8
|
+
|
|
9
|
+
// src/primitives/fixed-action-bar.tsx
|
|
10
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
11
|
+
var widthStyles = {
|
|
12
|
+
compact: "max-w-2xl",
|
|
13
|
+
narrow: "max-w-3xl",
|
|
14
|
+
wide: "max-w-5xl",
|
|
15
|
+
full: "max-w-none"
|
|
16
|
+
};
|
|
17
|
+
function FixedActionBar({
|
|
18
|
+
title,
|
|
19
|
+
description,
|
|
20
|
+
children,
|
|
21
|
+
width = "narrow",
|
|
22
|
+
actionsWidth = "auto",
|
|
23
|
+
className
|
|
24
|
+
}) {
|
|
25
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
26
|
+
"aside",
|
|
27
|
+
{
|
|
28
|
+
"aria-label": "Page action",
|
|
29
|
+
className: _chunkKWLSBTB2cjs.cn.call(void 0,
|
|
30
|
+
"fixed inset-x-0 bottom-0 z-40 border-t border-border bg-background/95 backdrop-blur-sm",
|
|
31
|
+
"pb-[env(safe-area-inset-bottom)] supports-backdrop-filter:bg-background/80",
|
|
32
|
+
className
|
|
33
|
+
),
|
|
34
|
+
children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunkKWLSBTB2cjs.cn.call(void 0, "mx-auto flex items-center gap-4 px-4 py-3 md:px-6", title ? "justify-between" : "justify-end", widthStyles[width]), children: [
|
|
35
|
+
title && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "min-w-0", children: [
|
|
36
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk373W6VADcjs.Text, { className: "truncate font-medium", children: title }),
|
|
37
|
+
description && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk373W6VADcjs.Text, { variant: "muted", className: "text-sm", children: description })
|
|
38
|
+
] }),
|
|
39
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunkKWLSBTB2cjs.cn.call(void 0, "shrink-0", actionsWidth === "full" && "w-full"), children })
|
|
40
|
+
] })
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
exports.FixedActionBar = FixedActionBar;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
cn
|
|
4
|
+
} from "./chunk-G6SRSWXB.js";
|
|
5
|
+
|
|
6
|
+
// src/primitives/anchor.tsx
|
|
7
|
+
import { Slot } from "@radix-ui/react-slot";
|
|
8
|
+
import { forwardRef } from "react";
|
|
9
|
+
import { jsx } from "react/jsx-runtime";
|
|
10
|
+
var Anchor = forwardRef(function Anchor2({ variant = "unstyled", size = "inherit", display = "inline", underline = false, asChild = false, border = "none", weight = "normal", className, ...props }, ref) {
|
|
11
|
+
const Component = asChild ? Slot : "a";
|
|
12
|
+
return /* @__PURE__ */ jsx(
|
|
13
|
+
Component,
|
|
14
|
+
{
|
|
15
|
+
ref,
|
|
16
|
+
className: cn(
|
|
17
|
+
variant === "text" && "font-medium text-primary underline-offset-4 hover:underline",
|
|
18
|
+
variant === "muted" && "text-muted-foreground underline underline-offset-2 hover:text-foreground",
|
|
19
|
+
variant === "foreground" && "text-foreground underline-offset-2 hover:underline",
|
|
20
|
+
size === "xs" && "text-xs",
|
|
21
|
+
size === "sm" && "text-sm",
|
|
22
|
+
display === "inline-flex" && "inline-flex items-center gap-1",
|
|
23
|
+
display === "block" && "block",
|
|
24
|
+
border === "bottom" && "border-b last:border-b-0",
|
|
25
|
+
weight === "medium" && "font-medium",
|
|
26
|
+
underline && "underline",
|
|
27
|
+
className
|
|
28
|
+
),
|
|
29
|
+
...props
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
export {
|
|
35
|
+
Anchor
|
|
36
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
var _chunkKWLSBTB2cjs = require('./chunk-KWLSBTB2.cjs');
|
|
5
|
+
|
|
6
|
+
// src/primitives/page-shell.tsx
|
|
7
|
+
var _react = require('react');
|
|
8
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
9
|
+
var widthStyles = {
|
|
10
|
+
narrow: "max-w-3xl",
|
|
11
|
+
wide: "max-w-5xl",
|
|
12
|
+
full: "max-w-none"
|
|
13
|
+
};
|
|
14
|
+
var paddingStyles = {
|
|
15
|
+
none: "",
|
|
16
|
+
base: "px-4 md:px-6",
|
|
17
|
+
relaxed: "px-6 md:px-10",
|
|
18
|
+
spacious: "px-6 md:px-10 xl:px-16"
|
|
19
|
+
};
|
|
20
|
+
var PageShell = _react.forwardRef.call(void 0,
|
|
21
|
+
function PageShell2({ width = "full", padding = "base", spacing = "default", bottomInset = "default", minHeight = "none", align = "start", printMode = "default", mobileTreatment = "page", as = "main", className, ...props }, ref) {
|
|
22
|
+
const Tag = as;
|
|
23
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
24
|
+
Tag,
|
|
25
|
+
{
|
|
26
|
+
ref,
|
|
27
|
+
className: _chunkKWLSBTB2cjs.cn.call(void 0,
|
|
28
|
+
"mx-auto w-full pt-6 md:pt-8 mb-28",
|
|
29
|
+
spacing === "default" ? "space-y-6" : "space-y-4",
|
|
30
|
+
widthStyles[width],
|
|
31
|
+
paddingStyles[padding],
|
|
32
|
+
bottomInset === "action" && "pb-32",
|
|
33
|
+
minHeight === "content" && "min-h-[70vh]",
|
|
34
|
+
align === "center" && "flex items-center",
|
|
35
|
+
printMode === "compact" && "print:my-0 print:pt-0",
|
|
36
|
+
mobileTreatment === "application" && "mb-0 flex min-h-[calc(100svh-4rem)] flex-1 flex-col space-y-0 px-0 pt-0 md:mb-28 md:block md:min-h-0 md:pt-8",
|
|
37
|
+
className
|
|
38
|
+
),
|
|
39
|
+
...props
|
|
40
|
+
}
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
exports.PageShell = PageShell;
|
|
@@ -0,0 +1,67 @@
|
|
|
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
|
+
|
|
3
|
+
// src/primitives/accent-theme.tsx
|
|
4
|
+
var _react = require('react');
|
|
5
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
6
|
+
var PALETTE_ID = /^[A-Za-z0-9_-]+$/;
|
|
7
|
+
function hexToHslTriplet(hex) {
|
|
8
|
+
const match = /^#([0-9a-f]{6})$/i.exec(hex.trim());
|
|
9
|
+
if (!match) return null;
|
|
10
|
+
const value = Number.parseInt(match[1], 16);
|
|
11
|
+
const red = (value >> 16 & 255) / 255;
|
|
12
|
+
const green = (value >> 8 & 255) / 255;
|
|
13
|
+
const blue = (value & 255) / 255;
|
|
14
|
+
const maximum = Math.max(red, green, blue);
|
|
15
|
+
const minimum = Math.min(red, green, blue);
|
|
16
|
+
const lightness = (maximum + minimum) / 2;
|
|
17
|
+
let hue = 0;
|
|
18
|
+
let saturation = 0;
|
|
19
|
+
if (maximum !== minimum) {
|
|
20
|
+
const delta = maximum - minimum;
|
|
21
|
+
saturation = lightness > 0.5 ? delta / (2 - maximum - minimum) : delta / (maximum + minimum);
|
|
22
|
+
if (maximum === red) hue = ((green - blue) / delta + (green < blue ? 6 : 0)) / 6;
|
|
23
|
+
else if (maximum === green) hue = ((blue - red) / delta + 2) / 6;
|
|
24
|
+
else hue = ((red - green) / delta + 4) / 6;
|
|
25
|
+
}
|
|
26
|
+
const round = (number) => Math.round(number * 10) / 10;
|
|
27
|
+
return `${round(hue * 360)} ${round(saturation * 100)}% ${round(lightness * 100)}%`;
|
|
28
|
+
}
|
|
29
|
+
function foregroundFor(hex) {
|
|
30
|
+
const match = /^#([0-9a-f]{6})$/i.exec(hex.trim());
|
|
31
|
+
if (!match) return "0 0% 100%";
|
|
32
|
+
const value = Number.parseInt(match[1], 16);
|
|
33
|
+
const channel = (number) => {
|
|
34
|
+
const normalized = number / 255;
|
|
35
|
+
return normalized <= 0.03928 ? normalized / 12.92 : ((normalized + 0.055) / 1.055) ** 2.4;
|
|
36
|
+
};
|
|
37
|
+
const luminance = 0.2126 * channel(value >> 16 & 255) + 0.7152 * channel(value >> 8 & 255) + 0.0722 * channel(value & 255);
|
|
38
|
+
return luminance > 0.45 ? "0 0% 9%" : "0 0% 100%";
|
|
39
|
+
}
|
|
40
|
+
function AccentTheme({ colours, palette, scope: target = "region", children }) {
|
|
41
|
+
const scope = `accent-${_react.useId.call(void 0, ).replace(/[^a-zA-Z0-9]/g, "")}`;
|
|
42
|
+
const light = _optionalChain([colours, 'optionalAccess', _ => _.light]) ? hexToHslTriplet(colours.light) : null;
|
|
43
|
+
const dark = _optionalChain([colours, 'optionalAccess', _2 => _2.dark]) ? hexToHslTriplet(colours.dark) : null;
|
|
44
|
+
if (!light && !dark) return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, { children });
|
|
45
|
+
const root = palette === void 0 ? null : PALETTE_ID.test(palette) ? `:root[data-theme="${palette}"]` : ":root:not(*)";
|
|
46
|
+
const lightSelector = target === "document" ? _nullishCoalesce(root, () => ( ":root")) : root ? `${root} .${scope}` : `.${scope}`;
|
|
47
|
+
const darkSelector = `${_nullishCoalesce(root, () => ( ":root"))}.dark${target === "document" ? "" : ` .${scope}`}`;
|
|
48
|
+
const rules = [];
|
|
49
|
+
if (light && _optionalChain([colours, 'optionalAccess', _3 => _3.light])) {
|
|
50
|
+
rules.push(
|
|
51
|
+
`${lightSelector}{--primary:${light};--primary-foreground:${foregroundFor(colours.light)};--ring:${light};--color-primary:hsl(var(--primary));--color-primary-foreground:hsl(var(--primary-foreground));--color-ring:hsl(var(--ring));}`
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
if (dark && _optionalChain([colours, 'optionalAccess', _4 => _4.dark])) {
|
|
55
|
+
rules.push(
|
|
56
|
+
`${darkSelector}{--primary:${dark};--primary-foreground:${foregroundFor(colours.dark)};--ring:${dark};--color-primary:hsl(var(--primary));--color-primary-foreground:hsl(var(--primary-foreground));--color-ring:hsl(var(--ring));}`
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
|
|
60
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "style", { dangerouslySetInnerHTML: { __html: rules.join("") } }),
|
|
61
|
+
target === "document" ? children : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: scope, children })
|
|
62
|
+
] });
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
exports.AccentTheme = AccentTheme;
|
|
@@ -1,10 +1,10 @@
|
|
|
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 _chunkJDEXZGIYcjs = require('./chunk-JDEXZGIY.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
var
|
|
7
|
+
var _chunkNKWHDI4Ccjs = require('./chunk-NKWHDI4C.cjs');
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
var _chunkKWLSBTB2cjs = require('./chunk-KWLSBTB2.cjs');
|
|
@@ -91,7 +91,7 @@ function VoiceSessionControls({
|
|
|
91
91
|
muted ? "bg-muted text-muted-foreground" : "bg-primary text-primary-foreground"
|
|
92
92
|
), children: muted ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.MicOff, { className: "size-5" }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.Mic, { className: "size-5" }) }),
|
|
93
93
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
94
|
-
|
|
94
|
+
_chunkNKWHDI4Ccjs.AgentAudioVisualizerBar,
|
|
95
95
|
{
|
|
96
96
|
"aria-hidden": "true",
|
|
97
97
|
size: "sm",
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import {
|
|
3
|
-
useDictation
|
|
4
|
-
} from "./chunk-RPSRCB5O.js";
|
|
5
|
-
import {
|
|
6
|
-
AgentAudioVisualizerBar
|
|
7
|
-
} from "./chunk-4TJBXXUE.js";
|
|
8
2
|
import {
|
|
9
3
|
Button
|
|
10
4
|
} from "./chunk-W326GKML.js";
|
|
5
|
+
import {
|
|
6
|
+
AgentAudioVisualizerBar
|
|
7
|
+
} from "./chunk-5OF6D3GH.js";
|
|
11
8
|
import {
|
|
12
9
|
cn
|
|
13
10
|
} from "./chunk-G6SRSWXB.js";
|
|
11
|
+
import {
|
|
12
|
+
useDictation
|
|
13
|
+
} from "./chunk-RPSRCB5O.js";
|
|
14
14
|
|
|
15
15
|
// src/primitives/voice-dictation-button.tsx
|
|
16
16
|
import {
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
cn
|
|
4
|
+
} from "./chunk-G6SRSWXB.js";
|
|
5
|
+
|
|
6
|
+
// src/primitives/brand-mark.tsx
|
|
7
|
+
import { forwardRef } from "react";
|
|
8
|
+
import { jsx } from "react/jsx-runtime";
|
|
9
|
+
var sizeStyles = {
|
|
10
|
+
sm: "h-6 max-w-36",
|
|
11
|
+
md: "h-7 max-w-44",
|
|
12
|
+
lg: "h-9 max-w-52"
|
|
13
|
+
};
|
|
14
|
+
var BrandMark = forwardRef(function BrandMark2({ size = "md", className, ...props }, ref) {
|
|
15
|
+
return /* @__PURE__ */ jsx(
|
|
16
|
+
"img",
|
|
17
|
+
{
|
|
18
|
+
ref,
|
|
19
|
+
className: cn("w-auto object-contain", sizeStyles[size], className),
|
|
20
|
+
...props
|
|
21
|
+
}
|
|
22
|
+
);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
export {
|
|
26
|
+
BrandMark
|
|
27
|
+
};
|
|
@@ -7,20 +7,17 @@ import {
|
|
|
7
7
|
} from "./chunk-EEHIMPD7.js";
|
|
8
8
|
import {
|
|
9
9
|
FilterBar
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-6LB37JWO.js";
|
|
11
11
|
import {
|
|
12
12
|
Heading
|
|
13
13
|
} from "./chunk-H2O6NMLZ.js";
|
|
14
14
|
import {
|
|
15
15
|
BoardColumnComponent,
|
|
16
16
|
MobileBoardView
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-62UTAG2C.js";
|
|
18
18
|
import {
|
|
19
19
|
ScrollArea
|
|
20
20
|
} from "./chunk-LELFPLTE.js";
|
|
21
|
-
import {
|
|
22
|
-
useIsMobile
|
|
23
|
-
} from "./chunk-PIU5SSUV.js";
|
|
24
21
|
import {
|
|
25
22
|
Tooltip,
|
|
26
23
|
TooltipContent,
|
|
@@ -36,6 +33,9 @@ import {
|
|
|
36
33
|
import {
|
|
37
34
|
cn
|
|
38
35
|
} from "./chunk-G6SRSWXB.js";
|
|
36
|
+
import {
|
|
37
|
+
useIsMobile
|
|
38
|
+
} from "./chunk-PIU5SSUV.js";
|
|
39
39
|
|
|
40
40
|
// src/primitives/resource-list.tsx
|
|
41
41
|
import { ChevronLeft, ChevronRight, Grid3X3, Kanban, List, Search, X } from "lucide-react";
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
var _chunkKWLSBTB2cjs = require('./chunk-KWLSBTB2.cjs');
|
|
5
|
+
|
|
6
|
+
// src/primitives/brand-mark.tsx
|
|
7
|
+
var _react = require('react');
|
|
8
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
9
|
+
var sizeStyles = {
|
|
10
|
+
sm: "h-6 max-w-36",
|
|
11
|
+
md: "h-7 max-w-44",
|
|
12
|
+
lg: "h-9 max-w-52"
|
|
13
|
+
};
|
|
14
|
+
var BrandMark = _react.forwardRef.call(void 0, function BrandMark2({ size = "md", className, ...props }, ref) {
|
|
15
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
16
|
+
"img",
|
|
17
|
+
{
|
|
18
|
+
ref,
|
|
19
|
+
className: _chunkKWLSBTB2cjs.cn.call(void 0, "w-auto object-contain", sizeStyles[size], className),
|
|
20
|
+
...props
|
|
21
|
+
}
|
|
22
|
+
);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
exports.BrandMark = BrandMark;
|