@orangecheck/app-design 0.6.1 → 1.1.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 +23 -6
- package/dist/brand.js.map +1 -1
- package/dist/brand.mjs.map +1 -1
- package/dist/chrome.d.mts +78 -55
- package/dist/chrome.d.ts +78 -55
- package/dist/chrome.js +1100 -59
- package/dist/chrome.js.map +1 -1
- package/dist/chrome.mjs +1091 -61
- package/dist/chrome.mjs.map +1 -1
- package/dist/code.d.mts +52 -0
- package/dist/code.d.ts +52 -0
- package/dist/code.js +534 -0
- package/dist/code.js.map +1 -0
- package/dist/code.mjs +522 -0
- package/dist/code.mjs.map +1 -0
- package/dist/components.d.mts +216 -42
- package/dist/components.d.ts +216 -42
- package/dist/components.js +3350 -100
- package/dist/components.js.map +1 -1
- package/dist/components.mjs +3293 -103
- package/dist/components.mjs.map +1 -1
- package/dist/docs-DhnstueM.d.ts +219 -0
- package/dist/docs-DiR6s43s.d.mts +219 -0
- package/dist/family.d.mts +2 -0
- package/dist/family.d.ts +2 -0
- package/dist/family.js +167 -0
- package/dist/family.js.map +1 -0
- package/dist/family.mjs +154 -0
- package/dist/family.mjs.map +1 -0
- package/dist/format.d.mts +12 -0
- package/dist/format.d.ts +12 -0
- package/dist/format.js +65 -0
- package/dist/format.js.map +1 -0
- package/dist/format.mjs +58 -0
- package/dist/format.mjs.map +1 -0
- package/dist/hero-Dn37il-9.d.mts +31 -0
- package/dist/hero-Dn37il-9.d.ts +31 -0
- package/dist/index-C6hDqOOS.d.mts +58 -0
- package/dist/index-C6hDqOOS.d.ts +58 -0
- package/dist/index.d.mts +12 -3
- package/dist/index.d.ts +12 -3
- package/dist/index.js +4319 -295
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4219 -298
- package/dist/index.mjs.map +1 -1
- package/dist/mdx.d.mts +58 -0
- package/dist/mdx.d.ts +58 -0
- package/dist/mdx.js +1712 -0
- package/dist/mdx.js.map +1 -0
- package/dist/mdx.mjs +1685 -0
- package/dist/mdx.mjs.map +1 -0
- package/dist/primitives.d.mts +73 -5
- package/dist/primitives.d.ts +73 -5
- package/dist/primitives.js +331 -8
- package/dist/primitives.js.map +1 -1
- package/dist/primitives.mjs +320 -11
- package/dist/primitives.mjs.map +1 -1
- package/dist/session.d.mts +18 -0
- package/dist/session.d.ts +18 -0
- package/dist/session.js +432 -0
- package/dist/session.js.map +1 -0
- package/dist/session.mjs +401 -0
- package/dist/session.mjs.map +1 -0
- package/dist/status-badge-BEOxeY9j.d.ts +13 -0
- package/dist/status-badge-DRwGhB0h.d.mts +13 -0
- package/dist/styles/code.css +97 -0
- package/dist/styles/fonts.css +1 -1
- package/dist/styles/theme.css +2 -0
- package/dist/styles/tokens.css +44 -2
- package/dist/styles.css +1 -0
- package/dist/tokens.d.mts +3 -1
- package/dist/tokens.d.ts +3 -1
- package/dist/tokens.js +5 -3
- package/dist/tokens.js.map +1 -1
- package/dist/tokens.mjs +5 -3
- package/dist/tokens.mjs.map +1 -1
- package/dist/tool-shell-B1C7ahKE.d.ts +81 -0
- package/dist/tool-shell-BDx_N5ai.d.mts +81 -0
- package/dist/tools-BggNN5DV.d.ts +131 -0
- package/dist/tools-DFIxIj5p.d.mts +131 -0
- package/package.json +38 -2
package/dist/primitives.js
CHANGED
|
@@ -19,6 +19,9 @@ var DropdownMenuPrimitive = require('@radix-ui/react-dropdown-menu');
|
|
|
19
19
|
var PopoverPrimitive = require('@radix-ui/react-popover');
|
|
20
20
|
var TooltipPrimitive = require('@radix-ui/react-tooltip');
|
|
21
21
|
var TabsPrimitive = require('@radix-ui/react-tabs');
|
|
22
|
+
var QRCode = require('qrcode');
|
|
23
|
+
|
|
24
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
22
25
|
|
|
23
26
|
function _interopNamespace(e) {
|
|
24
27
|
if (e && e.__esModule) return e;
|
|
@@ -49,6 +52,7 @@ var DropdownMenuPrimitive__namespace = /*#__PURE__*/_interopNamespace(DropdownMe
|
|
|
49
52
|
var PopoverPrimitive__namespace = /*#__PURE__*/_interopNamespace(PopoverPrimitive);
|
|
50
53
|
var TooltipPrimitive__namespace = /*#__PURE__*/_interopNamespace(TooltipPrimitive);
|
|
51
54
|
var TabsPrimitive__namespace = /*#__PURE__*/_interopNamespace(TabsPrimitive);
|
|
55
|
+
var QRCode__default = /*#__PURE__*/_interopDefault(QRCode);
|
|
52
56
|
|
|
53
57
|
var merge = tailwindMerge.extendTailwindMerge({
|
|
54
58
|
extend: {
|
|
@@ -237,13 +241,13 @@ var badgeVariants = classVarianceAuthority.cva(
|
|
|
237
241
|
tone: {
|
|
238
242
|
neutral: "border-border bg-card text-foreground",
|
|
239
243
|
muted: "border-transparent bg-muted text-muted-foreground",
|
|
240
|
-
brand: "border-transparent bg-[color-mix(in_oklab,var(--oca-orange)
|
|
244
|
+
brand: "border-transparent bg-[color-mix(in_oklab,var(--oca-orange)_9%,var(--card))] text-oca-accent-ink",
|
|
241
245
|
danger: "border-transparent bg-[color-mix(in_oklab,var(--destructive)_12%,var(--card))] text-destructive",
|
|
242
246
|
// A good state is a neutral pill with a green dot, not a green pill.
|
|
243
247
|
success: GOOD_DOT,
|
|
244
248
|
// Aliases kept so older call sites keep compiling: attention is
|
|
245
249
|
// the brand accent, information is neutral.
|
|
246
|
-
warning: "border-transparent bg-[color-mix(in_oklab,var(--oca-orange)
|
|
250
|
+
warning: "border-transparent bg-[color-mix(in_oklab,var(--oca-orange)_9%,var(--card))] text-oca-accent-ink",
|
|
247
251
|
info: "border-border bg-card text-foreground",
|
|
248
252
|
// Inverted in dark mode, where ink would sit on a card of nearly its own colour.
|
|
249
253
|
ink: "border-transparent bg-oca-ink text-oca-ink-foreground dark:bg-foreground dark:text-background",
|
|
@@ -281,6 +285,30 @@ function StatusPill({
|
|
|
281
285
|
}
|
|
282
286
|
);
|
|
283
287
|
}
|
|
288
|
+
var WORD = {
|
|
289
|
+
live: "Live",
|
|
290
|
+
testing: "In testing",
|
|
291
|
+
"not-yet": "Not yet",
|
|
292
|
+
paused: "Paused",
|
|
293
|
+
good: "Good",
|
|
294
|
+
caution: "Caution",
|
|
295
|
+
refused: "Refused"
|
|
296
|
+
};
|
|
297
|
+
var TONE = {
|
|
298
|
+
live: "success",
|
|
299
|
+
testing: "brand",
|
|
300
|
+
"not-yet": "muted",
|
|
301
|
+
paused: "muted",
|
|
302
|
+
good: "success",
|
|
303
|
+
caution: "brand",
|
|
304
|
+
refused: "danger"
|
|
305
|
+
};
|
|
306
|
+
function statusWord(status) {
|
|
307
|
+
return WORD[status];
|
|
308
|
+
}
|
|
309
|
+
function StatusBadge({ status, className, ...props }) {
|
|
310
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Badge, { tone: TONE[status], "data-status": status, className: cn(className), ...props, children: WORD[status] });
|
|
311
|
+
}
|
|
284
312
|
var cardVariants = classVarianceAuthority.cva("relative rounded-[1.25rem] border", {
|
|
285
313
|
variants: {
|
|
286
314
|
tone: {
|
|
@@ -323,6 +351,20 @@ function CardContent({ className, ...props }) {
|
|
|
323
351
|
function CardFooter({ className, ...props }) {
|
|
324
352
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("mt-6 flex flex-wrap items-center gap-3", className), ...props });
|
|
325
353
|
}
|
|
354
|
+
function sharedContext(name, initial) {
|
|
355
|
+
const key = /* @__PURE__ */ Symbol.for(`@orangecheck/app-design/${name}`);
|
|
356
|
+
const store = globalThis;
|
|
357
|
+
return store[key] ?? (store[key] = react.createContext(initial));
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// src/lib/density.ts
|
|
361
|
+
var DensityContext = sharedContext("density", "comfortable");
|
|
362
|
+
function DensityProvider({ density, children }) {
|
|
363
|
+
return react.createElement(DensityContext.Provider, { value: density }, children);
|
|
364
|
+
}
|
|
365
|
+
function useDensity() {
|
|
366
|
+
return react.useContext(DensityContext);
|
|
367
|
+
}
|
|
326
368
|
var fieldBase = [
|
|
327
369
|
"w-full rounded-xl border border-input bg-card text-foreground placeholder:text-oca-subtle",
|
|
328
370
|
"text-base md:text-[0.9375rem] outline-none transition-[border-color,box-shadow]",
|
|
@@ -330,8 +372,24 @@ var fieldBase = [
|
|
|
330
372
|
"disabled:cursor-not-allowed disabled:opacity-55",
|
|
331
373
|
"aria-[invalid=true]:border-destructive aria-[invalid=true]:focus:ring-[color-mix(in_oklab,var(--destructive)_14%,transparent)]"
|
|
332
374
|
];
|
|
333
|
-
var
|
|
334
|
-
|
|
375
|
+
var FIELD_SIZE = {
|
|
376
|
+
md: "h-11 px-3.5",
|
|
377
|
+
sm: "h-9 rounded-[0.625rem] px-3 md:text-[0.875rem]"
|
|
378
|
+
};
|
|
379
|
+
var Input = react.forwardRef(function Input2({ className, type = "text", size, ...props }, ref) {
|
|
380
|
+
const density = useDensity();
|
|
381
|
+
const s = size ?? (density === "compact" ? "sm" : "md");
|
|
382
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
383
|
+
"input",
|
|
384
|
+
{
|
|
385
|
+
ref,
|
|
386
|
+
type,
|
|
387
|
+
"data-ui": "input",
|
|
388
|
+
"data-size": s,
|
|
389
|
+
className: cn(fieldBase, FIELD_SIZE[s], className),
|
|
390
|
+
...props
|
|
391
|
+
}
|
|
392
|
+
);
|
|
335
393
|
});
|
|
336
394
|
var Textarea = react.forwardRef(
|
|
337
395
|
function Textarea2({ className, ...props }, ref) {
|
|
@@ -388,15 +446,29 @@ function Field({ label, hint, optional, error, children, className, hideLabel, a
|
|
|
388
446
|
error ? /* @__PURE__ */ jsxRuntime.jsx("p", { id: errorId, role: "alert", className: "text-[0.8125rem] leading-snug text-destructive", children: error }) : null
|
|
389
447
|
] });
|
|
390
448
|
}
|
|
391
|
-
var
|
|
449
|
+
var SelectFieldContext = sharedContext("select-field", null);
|
|
450
|
+
function Select({
|
|
451
|
+
id,
|
|
452
|
+
"aria-describedby": describedBy,
|
|
453
|
+
"aria-invalid": invalid,
|
|
454
|
+
...props
|
|
455
|
+
}) {
|
|
456
|
+
return /* @__PURE__ */ jsxRuntime.jsx(SelectFieldContext.Provider, { value: { id, "aria-describedby": describedBy, "aria-invalid": invalid }, children: /* @__PURE__ */ jsxRuntime.jsx(SelectPrimitive__namespace.Root, { ...props }) });
|
|
457
|
+
}
|
|
392
458
|
var SelectGroup = SelectPrimitive__namespace.Group;
|
|
393
459
|
var SelectValue = SelectPrimitive__namespace.Value;
|
|
394
|
-
var SelectTrigger = react.forwardRef(function SelectTrigger2({ className, children, ...props }, ref) {
|
|
460
|
+
var SelectTrigger = react.forwardRef(function SelectTrigger2({ className, children, size, ...props }, ref) {
|
|
461
|
+
const density = useDensity();
|
|
462
|
+
const field = react.useContext(SelectFieldContext);
|
|
463
|
+
const s = size ?? (density === "compact" ? "sm" : "md");
|
|
395
464
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
396
465
|
SelectPrimitive__namespace.Trigger,
|
|
397
466
|
{
|
|
398
467
|
ref,
|
|
399
|
-
|
|
468
|
+
id: field?.id,
|
|
469
|
+
"aria-describedby": field?.["aria-describedby"],
|
|
470
|
+
"aria-invalid": field?.["aria-invalid"],
|
|
471
|
+
className: cn(fieldBase, FIELD_SIZE[s], "flex items-center justify-between gap-2 text-left", className),
|
|
400
472
|
...props,
|
|
401
473
|
children: [
|
|
402
474
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children }),
|
|
@@ -464,7 +536,8 @@ var Switch = react.forwardRef(function Switch2({ className, ...props }, ref) {
|
|
|
464
536
|
className: cn(
|
|
465
537
|
"peer inline-flex h-6 w-11 shrink-0 items-center rounded-full border border-transparent bg-input p-0.5",
|
|
466
538
|
"outline-none transition-colors focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
|
|
467
|
-
|
|
539
|
+
// The deep orange: the track is the state, so it must clear 3:1 on a card.
|
|
540
|
+
"data-[state=checked]:bg-oca-orange-deep disabled:cursor-not-allowed disabled:opacity-50",
|
|
468
541
|
className
|
|
469
542
|
),
|
|
470
543
|
...props,
|
|
@@ -756,11 +829,252 @@ var TabsTrigger = react.forwardRef(function TabsTrigger2({ className, ...props }
|
|
|
756
829
|
var TabsContent = react.forwardRef(function TabsContent2({ className, ...props }, ref) {
|
|
757
830
|
return /* @__PURE__ */ jsxRuntime.jsx(TabsPrimitive__namespace.Content, { ref, className: cn("mt-6 outline-none", className), ...props });
|
|
758
831
|
});
|
|
832
|
+
var GroupName = react.createContext(void 0);
|
|
833
|
+
function Accordion({
|
|
834
|
+
single = false,
|
|
835
|
+
children,
|
|
836
|
+
className
|
|
837
|
+
}) {
|
|
838
|
+
const name = react.useId();
|
|
839
|
+
return /* @__PURE__ */ jsxRuntime.jsx(GroupName.Provider, { value: single ? name : void 0, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("divide-y divide-border overflow-hidden rounded-[1.25rem] border border-border bg-card", className), children }) });
|
|
840
|
+
}
|
|
841
|
+
function AccordionItem({
|
|
842
|
+
title,
|
|
843
|
+
children,
|
|
844
|
+
defaultOpen = false,
|
|
845
|
+
id,
|
|
846
|
+
className
|
|
847
|
+
}) {
|
|
848
|
+
const name = react.useContext(GroupName);
|
|
849
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("details", { id, name, open: defaultOpen || void 0, className: cn("group scroll-mt-24", className), children: [
|
|
850
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
851
|
+
"summary",
|
|
852
|
+
{
|
|
853
|
+
className: cn(
|
|
854
|
+
"flex min-h-14 cursor-pointer list-none items-center justify-between gap-4 px-5 py-4 text-[1rem] font-medium leading-snug md:px-6",
|
|
855
|
+
// Inside the card's clip, so the ring is drawn within the row.
|
|
856
|
+
"transition-colors hover:bg-accent/60 focus-visible:outline-offset-[-2px] [&::-webkit-details-marker]:hidden"
|
|
857
|
+
),
|
|
858
|
+
children: [
|
|
859
|
+
title,
|
|
860
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
861
|
+
lucideReact.ChevronDown,
|
|
862
|
+
{
|
|
863
|
+
"aria-hidden": true,
|
|
864
|
+
className: "size-4 shrink-0 text-muted-foreground transition-transform duration-200 group-open:rotate-180"
|
|
865
|
+
}
|
|
866
|
+
)
|
|
867
|
+
]
|
|
868
|
+
}
|
|
869
|
+
),
|
|
870
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "oca-body px-5 pb-5 text-[0.9375rem] md:px-6 md:pb-6", children })
|
|
871
|
+
] });
|
|
872
|
+
}
|
|
873
|
+
var queue = [];
|
|
874
|
+
var asked = 0;
|
|
875
|
+
var hosts = 0;
|
|
876
|
+
var listeners = /* @__PURE__ */ new Set();
|
|
877
|
+
var emit = () => listeners.forEach((l) => l());
|
|
878
|
+
function ask(item) {
|
|
879
|
+
queue = [...queue, { ...item, id: ++asked }];
|
|
880
|
+
emit();
|
|
881
|
+
}
|
|
882
|
+
function done() {
|
|
883
|
+
queue = queue.slice(1);
|
|
884
|
+
emit();
|
|
885
|
+
}
|
|
886
|
+
function confirm(options) {
|
|
887
|
+
if (hosts === 0) {
|
|
888
|
+
console.error("confirm(): no <DialogHost /> is mounted, so nothing was asked; treating it as no.");
|
|
889
|
+
return Promise.resolve(false);
|
|
890
|
+
}
|
|
891
|
+
return new Promise((resolve) => ask({ id: 0, kind: "confirm", options, settle: resolve }));
|
|
892
|
+
}
|
|
893
|
+
function prompt(options) {
|
|
894
|
+
if (hosts === 0) {
|
|
895
|
+
console.error("prompt(): no <DialogHost /> is mounted, so nothing was asked; treating it as cancelled.");
|
|
896
|
+
return Promise.resolve(null);
|
|
897
|
+
}
|
|
898
|
+
return new Promise((resolve) => ask({ id: 0, kind: "prompt", options, settle: resolve }));
|
|
899
|
+
}
|
|
900
|
+
function subscribe(listener) {
|
|
901
|
+
listeners.add(listener);
|
|
902
|
+
hosts++;
|
|
903
|
+
return () => {
|
|
904
|
+
listeners.delete(listener);
|
|
905
|
+
hosts--;
|
|
906
|
+
};
|
|
907
|
+
}
|
|
908
|
+
var current = () => queue[0] ?? null;
|
|
909
|
+
var none = () => null;
|
|
910
|
+
function PromptBody({ ask: a }) {
|
|
911
|
+
const o = a.options;
|
|
912
|
+
const [value, setValue] = react.useState(o.defaultValue ?? "");
|
|
913
|
+
const [error, setError] = react.useState(null);
|
|
914
|
+
const submit = (e) => {
|
|
915
|
+
e.preventDefault();
|
|
916
|
+
if (o.minLength && value.length < o.minLength) {
|
|
917
|
+
setError(`At least ${o.minLength} characters.`);
|
|
918
|
+
return;
|
|
919
|
+
}
|
|
920
|
+
const refused = o.validate?.(value);
|
|
921
|
+
if (refused) {
|
|
922
|
+
setError(refused);
|
|
923
|
+
return;
|
|
924
|
+
}
|
|
925
|
+
a.settle(value);
|
|
926
|
+
done();
|
|
927
|
+
};
|
|
928
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit: submit, noValidate: true, children: [
|
|
929
|
+
/* @__PURE__ */ jsxRuntime.jsx(Field, { label: o.label ?? "Your answer", hint: o.hint, error, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
930
|
+
Input,
|
|
931
|
+
{
|
|
932
|
+
autoFocus: true,
|
|
933
|
+
type: o.secret ? "password" : "text",
|
|
934
|
+
autoComplete: o.secret ? "new-password" : "off",
|
|
935
|
+
placeholder: o.placeholder,
|
|
936
|
+
value,
|
|
937
|
+
onChange: (e) => {
|
|
938
|
+
setValue(e.target.value);
|
|
939
|
+
setError(null);
|
|
940
|
+
}
|
|
941
|
+
}
|
|
942
|
+
) }),
|
|
943
|
+
/* @__PURE__ */ jsxRuntime.jsxs(DialogFooter, { children: [
|
|
944
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
945
|
+
Button,
|
|
946
|
+
{
|
|
947
|
+
variant: "secondary",
|
|
948
|
+
onClick: () => {
|
|
949
|
+
a.settle(null);
|
|
950
|
+
done();
|
|
951
|
+
},
|
|
952
|
+
children: o.cancelLabel ?? "Cancel"
|
|
953
|
+
}
|
|
954
|
+
),
|
|
955
|
+
/* @__PURE__ */ jsxRuntime.jsx(Button, { type: "submit", variant: o.destructive ? "danger" : "primary", children: o.confirmLabel ?? "Continue" })
|
|
956
|
+
] })
|
|
957
|
+
] });
|
|
958
|
+
}
|
|
959
|
+
function DialogHost() {
|
|
960
|
+
const a = react.useSyncExternalStore(subscribe, current, none);
|
|
961
|
+
const cancel = () => {
|
|
962
|
+
if (!a) return;
|
|
963
|
+
if (a.kind === "confirm") a.settle(false);
|
|
964
|
+
else a.settle(null);
|
|
965
|
+
done();
|
|
966
|
+
};
|
|
967
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Dialog, { open: a !== null, onOpenChange: (open) => open ? void 0 : cancel(), children: a ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
968
|
+
DialogContent,
|
|
969
|
+
{
|
|
970
|
+
role: "alertdialog",
|
|
971
|
+
...a.options.message ? {} : { "aria-describedby": void 0 },
|
|
972
|
+
className: "w-[min(92vw,28rem)]",
|
|
973
|
+
children: [
|
|
974
|
+
/* @__PURE__ */ jsxRuntime.jsxs(DialogHeader, { children: [
|
|
975
|
+
/* @__PURE__ */ jsxRuntime.jsx(DialogTitle, { children: a.options.title }),
|
|
976
|
+
a.options.message ? /* @__PURE__ */ jsxRuntime.jsx(DialogDescription, { children: a.options.message }) : null
|
|
977
|
+
] }),
|
|
978
|
+
a.kind === "prompt" ? (
|
|
979
|
+
// Keyed by the ask, so a second prompt starts empty.
|
|
980
|
+
/* @__PURE__ */ jsxRuntime.jsx(PromptBody, { ask: a }, a.id)
|
|
981
|
+
) : /* @__PURE__ */ jsxRuntime.jsxs(DialogFooter, { children: [
|
|
982
|
+
/* @__PURE__ */ jsxRuntime.jsx(Button, { variant: "secondary", onClick: cancel, children: a.options.cancelLabel ?? "Cancel" }),
|
|
983
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
984
|
+
Button,
|
|
985
|
+
{
|
|
986
|
+
variant: a.options.destructive ? "danger" : "primary",
|
|
987
|
+
onClick: () => {
|
|
988
|
+
a.settle(true);
|
|
989
|
+
done();
|
|
990
|
+
},
|
|
991
|
+
children: a.options.confirmLabel ?? "Continue"
|
|
992
|
+
}
|
|
993
|
+
)
|
|
994
|
+
] })
|
|
995
|
+
]
|
|
996
|
+
}
|
|
997
|
+
) : null });
|
|
998
|
+
}
|
|
999
|
+
var N = new Intl.NumberFormat("en-US");
|
|
1000
|
+
function Pagination({
|
|
1001
|
+
pageIndex,
|
|
1002
|
+
pageSize,
|
|
1003
|
+
total,
|
|
1004
|
+
onPage,
|
|
1005
|
+
label = "Pages",
|
|
1006
|
+
className
|
|
1007
|
+
}) {
|
|
1008
|
+
const pages = Math.max(1, Math.ceil(total / pageSize));
|
|
1009
|
+
const index = Math.min(Math.max(0, pageIndex), pages - 1);
|
|
1010
|
+
if (index !== pageIndex && typeof process !== "undefined" && process.env.NODE_ENV !== "production") {
|
|
1011
|
+
console.warn(`Pagination: pageIndex ${pageIndex} is outside 0\u2013${pages - 1}; it counts from 0.`);
|
|
1012
|
+
}
|
|
1013
|
+
if (total <= pageSize) return null;
|
|
1014
|
+
const from = index * pageSize + 1;
|
|
1015
|
+
const to = Math.min(total, (index + 1) * pageSize);
|
|
1016
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("nav", { "aria-label": label, className: cn("flex items-center justify-between gap-4", className), children: [
|
|
1017
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { "aria-live": "polite", className: "oca-tabular text-[0.875rem] text-muted-foreground", children: [
|
|
1018
|
+
N.format(from),
|
|
1019
|
+
"\u2013",
|
|
1020
|
+
N.format(to),
|
|
1021
|
+
" of ",
|
|
1022
|
+
N.format(total)
|
|
1023
|
+
] }),
|
|
1024
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
|
|
1025
|
+
/* @__PURE__ */ jsxRuntime.jsxs(Button, { variant: "secondary", size: "sm", disabled: index === 0, onClick: () => onPage(index - 1), className: "pl-3", children: [
|
|
1026
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { "aria-hidden": true }),
|
|
1027
|
+
"Previous"
|
|
1028
|
+
] }),
|
|
1029
|
+
/* @__PURE__ */ jsxRuntime.jsxs(Button, { variant: "secondary", size: "sm", disabled: index >= pages - 1, onClick: () => onPage(index + 1), className: "pr-3", children: [
|
|
1030
|
+
"Next",
|
|
1031
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { "aria-hidden": true })
|
|
1032
|
+
] })
|
|
1033
|
+
] })
|
|
1034
|
+
] });
|
|
1035
|
+
}
|
|
1036
|
+
function QrCode({
|
|
1037
|
+
value,
|
|
1038
|
+
size = 200,
|
|
1039
|
+
label,
|
|
1040
|
+
className
|
|
1041
|
+
}) {
|
|
1042
|
+
const matrix = react.useMemo(() => {
|
|
1043
|
+
try {
|
|
1044
|
+
return QRCode__default.default.create(value, { errorCorrectionLevel: "M" }).modules;
|
|
1045
|
+
} catch {
|
|
1046
|
+
return null;
|
|
1047
|
+
}
|
|
1048
|
+
}, [value]);
|
|
1049
|
+
const path = react.useMemo(() => {
|
|
1050
|
+
if (!matrix) return "";
|
|
1051
|
+
let d = "";
|
|
1052
|
+
for (let y = 0; y < matrix.size; y++) {
|
|
1053
|
+
for (let x = 0; x < matrix.size; x++) {
|
|
1054
|
+
if (matrix.get(y, x)) d += `M${x} ${y}h1v1h-1z`;
|
|
1055
|
+
}
|
|
1056
|
+
}
|
|
1057
|
+
return d;
|
|
1058
|
+
}, [matrix]);
|
|
1059
|
+
const short = value.length > 28 ? `${value.slice(0, 28)}\u2026` : value;
|
|
1060
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1061
|
+
"div",
|
|
1062
|
+
{
|
|
1063
|
+
role: "img",
|
|
1064
|
+
"aria-label": matrix ? label ?? `QR code for ${short}` : "Too long for a QR code",
|
|
1065
|
+
className: cn("inline-block shrink-0 rounded-2xl bg-white p-3 ring-1 ring-border", className),
|
|
1066
|
+
style: { width: size, height: size },
|
|
1067
|
+
children: matrix ? /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: `0 0 ${matrix.size} ${matrix.size}`, shapeRendering: "crispEdges", "aria-hidden": true, className: "block size-full", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: path, fill: "#0a0a0a" }) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { "aria-hidden": true, className: "flex size-full items-center justify-center text-center text-[0.8125rem] text-[#54585e]", children: "Too long for a QR code" })
|
|
1068
|
+
}
|
|
1069
|
+
);
|
|
1070
|
+
}
|
|
759
1071
|
|
|
760
1072
|
Object.defineProperty(exports, "toast", {
|
|
761
1073
|
enumerable: true,
|
|
762
1074
|
get: function () { return sonner.toast; }
|
|
763
1075
|
});
|
|
1076
|
+
exports.Accordion = Accordion;
|
|
1077
|
+
exports.AccordionItem = AccordionItem;
|
|
764
1078
|
exports.Badge = Badge;
|
|
765
1079
|
exports.Button = Button;
|
|
766
1080
|
exports.Card = Card;
|
|
@@ -771,12 +1085,14 @@ exports.CardHeader = CardHeader;
|
|
|
771
1085
|
exports.CardNumeral = CardNumeral;
|
|
772
1086
|
exports.CardTitle = CardTitle;
|
|
773
1087
|
exports.Checkbox = Checkbox;
|
|
1088
|
+
exports.DensityProvider = DensityProvider;
|
|
774
1089
|
exports.Dialog = Dialog;
|
|
775
1090
|
exports.DialogClose = DialogClose;
|
|
776
1091
|
exports.DialogContent = DialogContent;
|
|
777
1092
|
exports.DialogDescription = DialogDescription;
|
|
778
1093
|
exports.DialogFooter = DialogFooter;
|
|
779
1094
|
exports.DialogHeader = DialogHeader;
|
|
1095
|
+
exports.DialogHost = DialogHost;
|
|
780
1096
|
exports.DialogTitle = DialogTitle;
|
|
781
1097
|
exports.DialogTrigger = DialogTrigger;
|
|
782
1098
|
exports.DropdownMenu = DropdownMenu;
|
|
@@ -790,10 +1106,12 @@ exports.Field = Field;
|
|
|
790
1106
|
exports.Input = Input;
|
|
791
1107
|
exports.Kbd = Kbd;
|
|
792
1108
|
exports.Label = Label;
|
|
1109
|
+
exports.Pagination = Pagination;
|
|
793
1110
|
exports.Popover = Popover;
|
|
794
1111
|
exports.PopoverAnchor = PopoverAnchor;
|
|
795
1112
|
exports.PopoverContent = PopoverContent;
|
|
796
1113
|
exports.PopoverTrigger = PopoverTrigger;
|
|
1114
|
+
exports.QrCode = QrCode;
|
|
797
1115
|
exports.RadioGroup = RadioGroup;
|
|
798
1116
|
exports.RadioGroupItem = RadioGroupItem;
|
|
799
1117
|
exports.ScrollFade = ScrollFade;
|
|
@@ -812,6 +1130,7 @@ exports.SheetTitle = SheetTitle;
|
|
|
812
1130
|
exports.SheetTrigger = SheetTrigger;
|
|
813
1131
|
exports.Skeleton = Skeleton;
|
|
814
1132
|
exports.Spinner = Spinner;
|
|
1133
|
+
exports.StatusBadge = StatusBadge;
|
|
815
1134
|
exports.StatusDot = StatusDot;
|
|
816
1135
|
exports.StatusPill = StatusPill;
|
|
817
1136
|
exports.Switch = Switch;
|
|
@@ -829,6 +1148,10 @@ exports.badgeVariants = badgeVariants;
|
|
|
829
1148
|
exports.buttonVariants = buttonVariants;
|
|
830
1149
|
exports.cardVariants = cardVariants;
|
|
831
1150
|
exports.cn = cn;
|
|
1151
|
+
exports.confirm = confirm;
|
|
1152
|
+
exports.prompt = prompt;
|
|
1153
|
+
exports.statusWord = statusWord;
|
|
1154
|
+
exports.useDensity = useDensity;
|
|
832
1155
|
exports.useTimedOut = useTimedOut;
|
|
833
1156
|
//# sourceMappingURL=primitives.js.map
|
|
834
1157
|
//# sourceMappingURL=primitives.js.map
|