@apliteni/apliteni-ui 0.48.0 → 0.49.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/README.md +6 -0
- package/package.json +1 -1
- package/react/README.md +10 -1
- package/react/dist/index.d.ts +10 -1
- package/react/dist/index.js +231 -217
- package/src/components/index.js +4 -2
- package/src/styles/callout.css +3 -0
package/README.md
CHANGED
|
@@ -224,6 +224,12 @@ the repository root. Start Storybook with `npm run storybook`. For React, use `n
|
|
|
224
224
|
storybook -w react`. Before opening a PR, run `npm test`, `npm test -w react`, `npm run
|
|
225
225
|
build-storybook`, and `node site/build.mjs`.
|
|
226
226
|
|
|
227
|
+
Add a general, composable kit component only when all three checks are true:
|
|
228
|
+
(1) the issue names at least two products that use it or have requested it;
|
|
229
|
+
(2) existing components cannot provide it without copying their markup or logic;
|
|
230
|
+
(3) it contains no domain-specific data or rules. Otherwise, build the UI by
|
|
231
|
+
composition and add a Storybook showcase. Keep the vanilla kit’s existing look.
|
|
232
|
+
|
|
227
233
|
To add a component, put its token-based CSS in `src/styles/`. Include it in
|
|
228
234
|
`src/index.css` and in both the `styles` map and `cssText` in `src/inline.js`. Add the
|
|
229
235
|
HTML factory under `src/components/`, export it from `src/index.js`, and add a
|
package/package.json
CHANGED
package/react/README.md
CHANGED
|
@@ -28,7 +28,7 @@ import '@apliteni/apliteni-ui/react/css'; // React components' shell styles (mo
|
|
|
28
28
|
import { DataTable, Modal, Button } from '@apliteni/apliteni-ui/react';
|
|
29
29
|
```
|
|
30
30
|
|
|
31
|
-
Components: `DataTable`, `Pagination`, `StatBand`, `Modal`, `Confirm`, `Drawer`, `CommandPalette`, `Dropdown`, `BackLink`, `Snippet`, `Tabs`, `Button`, `Badge`, `Card`, `Icon`.
|
|
31
|
+
Components: `DataTable`, `Pagination`, `StatBand`, `Modal`, `Confirm`, `Drawer`, `CommandPalette`, `Dropdown`, `BackLink`, `Snippet`, `Tabs`, `Button`, `Badge`, `Card`, `Callout`, `Icon`.
|
|
32
32
|
|
|
33
33
|
`Snippet` accepts `label`, `code`, `reveal`, and `copyLabel` props. It treats `code`
|
|
34
34
|
as plain text and copies it exactly as provided. After a successful clipboard write,
|
|
@@ -42,6 +42,15 @@ can try again or select the text manually.
|
|
|
42
42
|
Before a reveal snippet, explain that the secret is stored hashed and will not be
|
|
43
43
|
shown again, and ask the reader to copy it now. The page decides when to remove it.
|
|
44
44
|
|
|
45
|
+
`Callout` accepts `children`, optional `actions`, and an `icon` override. `neutral` is the default.
|
|
46
|
+
The other variants are `info`, `success`, `warn`, and `danger`. Only `danger` uses `role="alert"`.
|
|
47
|
+
|
|
48
|
+
```tsx
|
|
49
|
+
<Callout variant="warn" actions={<Button size="sm">Review period</Button>}>
|
|
50
|
+
<b>Incomplete.</b> This period is still open.
|
|
51
|
+
</Callout>
|
|
52
|
+
```
|
|
53
|
+
|
|
45
54
|
`Button` accepts `size="xs" | "sm" | "md" | "lg"` (default `md`). Use `xs`
|
|
46
55
|
for a small inline control: `<Button size="xs" variant="ghost" icon="copy" iconOnly>Copy</Button>`.
|
|
47
56
|
Its glyph is 13px and its icon-only target is 24×24px; labelled xs buttons use
|
package/react/dist/index.d.ts
CHANGED
|
@@ -41,6 +41,15 @@ declare function Card({ title, sub, level, children }: {
|
|
|
41
41
|
children?: ReactNode;
|
|
42
42
|
}): react.JSX.Element;
|
|
43
43
|
|
|
44
|
+
type CalloutVariant = 'neutral' | 'info' | 'success' | 'warn' | 'danger';
|
|
45
|
+
interface CalloutProps {
|
|
46
|
+
variant?: CalloutVariant;
|
|
47
|
+
icon?: string;
|
|
48
|
+
children: ReactNode;
|
|
49
|
+
actions?: ReactNode;
|
|
50
|
+
}
|
|
51
|
+
declare function Callout({ variant, icon, children, actions }: CalloutProps): react.JSX.Element;
|
|
52
|
+
|
|
44
53
|
type StatTone = 'good' | 'bad' | 'neutral';
|
|
45
54
|
type StatVariant = 'band' | 'tiles' | 'open';
|
|
46
55
|
interface StatDelta {
|
|
@@ -544,4 +553,4 @@ declare function Toast({ children }: ToastProps): react.JSX.Element;
|
|
|
544
553
|
declare const PAGE_SIZES: readonly number[];
|
|
545
554
|
declare const DEFAULT_PAGE_SIZE: number;
|
|
546
555
|
|
|
547
|
-
export { BackLink, type BackLinkOwnProps, type BackLinkProps, Badge, BusyRegion, type BusyRegionProps, Button, type ButtonProps, Card, type Column, type CommandGroup, type CommandItem, CommandPalette, type CommandPaletteProps, Confirm, type ConfirmProps, DEFAULT_PAGE_SIZE, DataTable, type DataTableProps, DeltaValue, type DeltaValueProps, Denied, type DeniedProps, Drawer, type DrawerProps, DrawerSection, type DrawerSectionProps, Dropdown, type DropdownBadge, type DropdownEntry, type DropdownItem, type DropdownProps, type DropdownRowProps, type DropdownSearch, type DropdownSection, type DropdownSeparator, FileField, type FileFieldProps, type Filter, FilterBar, type FilterBarProps, Icon, KeyValueList, type KeyValueListProps, type KeyValueRow, Modal, type ModalProps, NumericValue, type NumericValueProps, PAGE_SIZES, Pagination, type PaginationProps, RowIdentity, type RowIdentityProps, type SegmentOption, Segmented, type SegmentedProps, SelectField, type SelectFieldProps, Skeleton, type SkeletonProps, SkeletonTable, type SkeletonTableProps, Snippet, type SnippetProps, StatBand, type StatBandProps, type StatDelta, type StatFigure, type StatTone, type StatVariant, type TabItem, type TableSort, Tabs, type TabsProps, TextArea, type TextAreaProps, TextField, type TextFieldProps, Timeline, type TimelineEvent, type TimelineProps, Toast, type ToastNotice, type ToastProps, sortTableRows, useToast };
|
|
556
|
+
export { BackLink, type BackLinkOwnProps, type BackLinkProps, Badge, BusyRegion, type BusyRegionProps, Button, type ButtonProps, Callout, type CalloutProps, type CalloutVariant, Card, type Column, type CommandGroup, type CommandItem, CommandPalette, type CommandPaletteProps, Confirm, type ConfirmProps, DEFAULT_PAGE_SIZE, DataTable, type DataTableProps, DeltaValue, type DeltaValueProps, Denied, type DeniedProps, Drawer, type DrawerProps, DrawerSection, type DrawerSectionProps, Dropdown, type DropdownBadge, type DropdownEntry, type DropdownItem, type DropdownProps, type DropdownRowProps, type DropdownSearch, type DropdownSection, type DropdownSeparator, FileField, type FileFieldProps, type Filter, FilterBar, type FilterBarProps, Icon, KeyValueList, type KeyValueListProps, type KeyValueRow, Modal, type ModalProps, NumericValue, type NumericValueProps, PAGE_SIZES, Pagination, type PaginationProps, RowIdentity, type RowIdentityProps, type SegmentOption, Segmented, type SegmentedProps, SelectField, type SelectFieldProps, Skeleton, type SkeletonProps, SkeletonTable, type SkeletonTableProps, Snippet, type SnippetProps, StatBand, type StatBandProps, type StatDelta, type StatFigure, type StatTone, type StatVariant, type TabItem, type TableSort, Tabs, type TabsProps, TextArea, type TextAreaProps, TextField, type TextFieldProps, Timeline, type TimelineEvent, type TimelineProps, Toast, type ToastNotice, type ToastProps, sortTableRows, useToast };
|
package/react/dist/index.js
CHANGED
|
@@ -174,9 +174,22 @@ function Card({ title, sub, level = 2, children }) {
|
|
|
174
174
|
] });
|
|
175
175
|
}
|
|
176
176
|
|
|
177
|
+
// src/primitives/Callout.tsx
|
|
178
|
+
import { calloutIcons, icon as kitIcon } from "@apliteni/apliteni-ui";
|
|
179
|
+
import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
180
|
+
function Callout({ variant, icon: icon5 = calloutIcons[variant ?? "neutral"], children, actions }) {
|
|
181
|
+
return /* @__PURE__ */ jsxs3("div", { className: `ui-callout${variant && variant !== "neutral" ? ` ui-callout--${variant}` : ""}`, role: variant === "danger" ? "alert" : void 0, children: [
|
|
182
|
+
/* @__PURE__ */ jsx5("span", { className: "ui-callout__icon", dangerouslySetInnerHTML: { __html: kitIcon(icon5) } }),
|
|
183
|
+
/* @__PURE__ */ jsxs3("div", { className: "ui-callout__body", children: [
|
|
184
|
+
children,
|
|
185
|
+
actions != null && /* @__PURE__ */ jsx5("div", { className: "ui-toolbar ui-callout__actions", children: actions })
|
|
186
|
+
] })
|
|
187
|
+
] });
|
|
188
|
+
}
|
|
189
|
+
|
|
177
190
|
// src/primitives/StatBand.tsx
|
|
178
191
|
import { useId } from "react";
|
|
179
|
-
import { Fragment, jsx as
|
|
192
|
+
import { Fragment, jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
180
193
|
var GLYPH = { up: "arrowUp", down: "arrowDown", flat: "minus" };
|
|
181
194
|
var directionOf = (text2) => {
|
|
182
195
|
const t = text2.trim();
|
|
@@ -185,15 +198,15 @@ var directionOf = (text2) => {
|
|
|
185
198
|
var hasChange = (d) => !!d && d.value != null && d.value !== "";
|
|
186
199
|
function Delta({ delta, basisId }) {
|
|
187
200
|
if (!hasChange(delta)) {
|
|
188
|
-
return /* @__PURE__ */
|
|
201
|
+
return /* @__PURE__ */ jsx6("dd", { className: "ui-stat__delta ui-stat__delta--none", children: delta.none || "No earlier figure" });
|
|
189
202
|
}
|
|
190
203
|
const dir = delta.direction && GLYPH[delta.direction] ? delta.direction : directionOf(delta.value);
|
|
191
|
-
return /* @__PURE__ */
|
|
192
|
-
/* @__PURE__ */
|
|
193
|
-
/* @__PURE__ */
|
|
194
|
-
delta.basis ? /* @__PURE__ */
|
|
204
|
+
return /* @__PURE__ */ jsxs4("dd", { className: "ui-stat__delta", "aria-describedby": !delta.basis && basisId ? basisId : void 0, children: [
|
|
205
|
+
/* @__PURE__ */ jsx6(Icon, { name: GLYPH[dir] }),
|
|
206
|
+
/* @__PURE__ */ jsx6("span", { className: "ui-stat__change", children: delta.value }),
|
|
207
|
+
delta.basis ? /* @__PURE__ */ jsxs4(Fragment, { children: [
|
|
195
208
|
" ",
|
|
196
|
-
/* @__PURE__ */
|
|
209
|
+
/* @__PURE__ */ jsx6("span", { className: "ui-stat__basis", children: delta.basis })
|
|
197
210
|
] }) : null
|
|
198
211
|
] });
|
|
199
212
|
}
|
|
@@ -202,16 +215,16 @@ function StatBand({ stats, variant = "tiles", basis, label, id }) {
|
|
|
202
215
|
const v = ["band", "tiles", "open"].includes(variant) ? variant : "tiles";
|
|
203
216
|
const basisId = basis ? `${id || auto}-basis` : void 0;
|
|
204
217
|
const root = ["ui-stats", `ui-stats--${v}`, v === "band" && "ui-card"].filter(Boolean).join(" ");
|
|
205
|
-
return /* @__PURE__ */
|
|
206
|
-
basis ? /* @__PURE__ */
|
|
207
|
-
/* @__PURE__ */
|
|
218
|
+
return /* @__PURE__ */ jsxs4("div", { className: root, role: label ? "group" : void 0, "aria-label": label || void 0, children: [
|
|
219
|
+
basis ? /* @__PURE__ */ jsx6("p", { className: "ui-stats__basis", id: basisId, children: basis }) : null,
|
|
220
|
+
/* @__PURE__ */ jsx6("dl", { className: "ui-stats__list", children: stats.map((s, i) => {
|
|
208
221
|
const tone = hasChange(s.delta) && (s.delta.tone === "good" || s.delta.tone === "bad") ? s.delta.tone : "";
|
|
209
222
|
const cls = ["ui-stat", tone && `ui-stat--${tone}`, v === "tiles" && "ui-card ui-card--pad-sm"].filter(Boolean).join(" ");
|
|
210
|
-
return /* @__PURE__ */
|
|
211
|
-
/* @__PURE__ */
|
|
212
|
-
/* @__PURE__ */
|
|
213
|
-
s.delta ? /* @__PURE__ */
|
|
214
|
-
s.trend ? /* @__PURE__ */
|
|
223
|
+
return /* @__PURE__ */ jsxs4("div", { className: cls, children: [
|
|
224
|
+
/* @__PURE__ */ jsx6("dt", { className: "ui-stat__label", children: s.label }),
|
|
225
|
+
/* @__PURE__ */ jsx6("dd", { className: "ui-stat__value", children: s.value }),
|
|
226
|
+
s.delta ? /* @__PURE__ */ jsx6(Delta, { delta: s.delta, basisId }) : null,
|
|
227
|
+
s.trend ? /* @__PURE__ */ jsx6("dd", { className: "ui-stat__trend", children: s.trend }) : null
|
|
215
228
|
] }, `${s.label}-${i}`);
|
|
216
229
|
}) })
|
|
217
230
|
] });
|
|
@@ -435,7 +448,7 @@ function useDialog(active, { root, panel, body, initialFocus }, onClose) {
|
|
|
435
448
|
}
|
|
436
449
|
|
|
437
450
|
// src/Modal.tsx
|
|
438
|
-
import { jsx as
|
|
451
|
+
import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
439
452
|
function Modal({ open, title, onClose, footer, children, initialFocusRef, role = "dialog" }) {
|
|
440
453
|
const id = useId2();
|
|
441
454
|
const titleId = `${id}-title`;
|
|
@@ -447,7 +460,7 @@ function Modal({ open, title, onClose, footer, children, initialFocusRef, role =
|
|
|
447
460
|
const scope = useDialog(shown, { root, panel, body, initialFocus: initialFocusRef }, onClose);
|
|
448
461
|
if (!mounted) return null;
|
|
449
462
|
return createPortal(
|
|
450
|
-
/* @__PURE__ */
|
|
463
|
+
/* @__PURE__ */ jsx7(DialogScope.Provider, { value: scope, children: /* @__PURE__ */ jsx7("div", { className: shown ? "rx-scrim is-open" : "rx-scrim", ref: root, onMouseDown: dismissOnScrim(onClose), children: /* @__PURE__ */ jsxs5(
|
|
451
464
|
"div",
|
|
452
465
|
{
|
|
453
466
|
className: "rx-modal",
|
|
@@ -458,12 +471,12 @@ function Modal({ open, title, onClose, footer, children, initialFocusRef, role =
|
|
|
458
471
|
tabIndex: -1,
|
|
459
472
|
ref: panel,
|
|
460
473
|
children: [
|
|
461
|
-
/* @__PURE__ */
|
|
462
|
-
/* @__PURE__ */
|
|
463
|
-
/* @__PURE__ */
|
|
474
|
+
/* @__PURE__ */ jsxs5("div", { className: "rx-modal__head", children: [
|
|
475
|
+
/* @__PURE__ */ jsx7("div", { className: "rx-modal__title", id: titleId, children: title }),
|
|
476
|
+
/* @__PURE__ */ jsx7(Button, { variant: "ghost", size: "sm", iconOnly: true, icon: "x", "aria-label": "Close", onClick: onClose })
|
|
464
477
|
] }),
|
|
465
|
-
/* @__PURE__ */
|
|
466
|
-
footer && /* @__PURE__ */
|
|
478
|
+
/* @__PURE__ */ jsx7("div", { className: "rx-modal__body", id: bodyId, ref: body, children }),
|
|
479
|
+
footer && /* @__PURE__ */ jsx7("div", { className: "rx-modal__foot", children: footer })
|
|
467
480
|
]
|
|
468
481
|
}
|
|
469
482
|
) }) }),
|
|
@@ -472,7 +485,7 @@ function Modal({ open, title, onClose, footer, children, initialFocusRef, role =
|
|
|
472
485
|
}
|
|
473
486
|
|
|
474
487
|
// src/Confirm.tsx
|
|
475
|
-
import { Fragment as Fragment2, jsx as
|
|
488
|
+
import { Fragment as Fragment2, jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
476
489
|
function Confirm({
|
|
477
490
|
open,
|
|
478
491
|
title,
|
|
@@ -485,7 +498,7 @@ function Confirm({
|
|
|
485
498
|
onCancel
|
|
486
499
|
}) {
|
|
487
500
|
const safeAction = useRef4(null);
|
|
488
|
-
return /* @__PURE__ */
|
|
501
|
+
return /* @__PURE__ */ jsx8(
|
|
489
502
|
Modal,
|
|
490
503
|
{
|
|
491
504
|
open,
|
|
@@ -493,9 +506,9 @@ function Confirm({
|
|
|
493
506
|
onClose: onCancel,
|
|
494
507
|
role: "alertdialog",
|
|
495
508
|
initialFocusRef: safeAction,
|
|
496
|
-
footer: /* @__PURE__ */
|
|
497
|
-
/* @__PURE__ */
|
|
498
|
-
/* @__PURE__ */
|
|
509
|
+
footer: /* @__PURE__ */ jsxs6(Fragment2, { children: [
|
|
510
|
+
/* @__PURE__ */ jsx8(Button, { ref: safeAction, variant: "ghost", onClick: onCancel, children: cancelLabel }),
|
|
511
|
+
/* @__PURE__ */ jsx8(Button, { variant: danger ? "danger" : "primary", busy, onClick: onConfirm, children: confirmLabel })
|
|
499
512
|
] }),
|
|
500
513
|
children: body
|
|
501
514
|
}
|
|
@@ -505,7 +518,7 @@ function Confirm({
|
|
|
505
518
|
// src/Drawer.tsx
|
|
506
519
|
import { useId as useId3, useRef as useRef5 } from "react";
|
|
507
520
|
import { createPortal as createPortal2 } from "react-dom";
|
|
508
|
-
import { jsx as
|
|
521
|
+
import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
509
522
|
function Drawer({
|
|
510
523
|
open,
|
|
511
524
|
title,
|
|
@@ -525,9 +538,9 @@ function Drawer({
|
|
|
525
538
|
if (!mounted) return null;
|
|
526
539
|
const cls = ["ui-drawer", `ui-drawer--${side}`, `ui-drawer--${size}`, shown && "is-open"].filter(Boolean).join(" ");
|
|
527
540
|
return createPortal2(
|
|
528
|
-
/* @__PURE__ */
|
|
529
|
-
/* @__PURE__ */
|
|
530
|
-
/* @__PURE__ */
|
|
541
|
+
/* @__PURE__ */ jsx9(DialogScope.Provider, { value: scope, children: /* @__PURE__ */ jsxs7("div", { className: cls, ref: root, children: [
|
|
542
|
+
/* @__PURE__ */ jsx9("div", { className: "ui-drawer__scrim", onMouseDown: dismissOnScrim(onClose) }),
|
|
543
|
+
/* @__PURE__ */ jsxs7(
|
|
531
544
|
"aside",
|
|
532
545
|
{
|
|
533
546
|
className: "ui-drawer__panel",
|
|
@@ -537,12 +550,12 @@ function Drawer({
|
|
|
537
550
|
tabIndex: -1,
|
|
538
551
|
ref: panel,
|
|
539
552
|
children: [
|
|
540
|
-
/* @__PURE__ */
|
|
541
|
-
/* @__PURE__ */
|
|
542
|
-
/* @__PURE__ */
|
|
553
|
+
/* @__PURE__ */ jsxs7("header", { className: "ui-drawer__header", children: [
|
|
554
|
+
/* @__PURE__ */ jsx9("h2", { className: "ui-drawer__title", id: titleId, children: title }),
|
|
555
|
+
/* @__PURE__ */ jsx9("button", { type: "button", className: "ui-drawer__close", "aria-label": closeLabel, onClick: onClose, children: /* @__PURE__ */ jsx9(Icon, { name: "x" }) })
|
|
543
556
|
] }),
|
|
544
|
-
/* @__PURE__ */
|
|
545
|
-
footer && /* @__PURE__ */
|
|
557
|
+
/* @__PURE__ */ jsx9("div", { className: "ui-drawer__body", ref: body, children }),
|
|
558
|
+
footer && /* @__PURE__ */ jsx9("footer", { className: "ui-drawer__footer", children: footer })
|
|
546
559
|
]
|
|
547
560
|
}
|
|
548
561
|
)
|
|
@@ -555,9 +568,9 @@ function Drawer({
|
|
|
555
568
|
import { useCallback, useEffect as useEffect2, useId as useId4, useMemo, useRef as useRef6, useState as useState2 } from "react";
|
|
556
569
|
import { createPortal as createPortal3 } from "react-dom";
|
|
557
570
|
import { rankGroups, icon as icon2 } from "@apliteni/apliteni-ui";
|
|
558
|
-
import { jsx as
|
|
571
|
+
import { jsx as jsx10, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
559
572
|
var cx2 = (...a) => a.filter(Boolean).join(" ");
|
|
560
|
-
var Glyph = ({ name, className }) => /* @__PURE__ */
|
|
573
|
+
var Glyph = ({ name, className }) => /* @__PURE__ */ jsx10("span", { className, "aria-hidden": "true", dangerouslySetInnerHTML: { __html: icon2(name) } });
|
|
561
574
|
var keysOf = (shortcut) => shortcut == null ? [] : Array.isArray(shortcut) ? shortcut : [shortcut];
|
|
562
575
|
function CommandPalette({
|
|
563
576
|
open,
|
|
@@ -622,9 +635,9 @@ function CommandPalette({
|
|
|
622
635
|
const listId = `${uid}-list`;
|
|
623
636
|
let n = 0;
|
|
624
637
|
return createPortal3(
|
|
625
|
-
/* @__PURE__ */
|
|
626
|
-
/* @__PURE__ */
|
|
627
|
-
/* @__PURE__ */
|
|
638
|
+
/* @__PURE__ */ jsx10(DialogScope.Provider, { value: scope, children: /* @__PURE__ */ jsxs8("div", { className: cx2("ui-cmdk", density === "roomy" && "ui-cmdk--roomy", "is-open"), ref: root, children: [
|
|
639
|
+
/* @__PURE__ */ jsx10("div", { className: "ui-cmdk__scrim", onMouseDown: dismissOnScrim(onClose) }),
|
|
640
|
+
/* @__PURE__ */ jsxs8(
|
|
628
641
|
"div",
|
|
629
642
|
{
|
|
630
643
|
className: "ui-cmdk__panel",
|
|
@@ -635,9 +648,9 @@ function CommandPalette({
|
|
|
635
648
|
ref: panel,
|
|
636
649
|
onKeyDown,
|
|
637
650
|
children: [
|
|
638
|
-
/* @__PURE__ */
|
|
639
|
-
/* @__PURE__ */
|
|
640
|
-
/* @__PURE__ */
|
|
651
|
+
/* @__PURE__ */ jsxs8("div", { className: "ui-cmdk__search", ref: search, children: [
|
|
652
|
+
/* @__PURE__ */ jsx10(Glyph, { name: "search", className: "ui-cmdk__search-ic" }),
|
|
653
|
+
/* @__PURE__ */ jsx10(
|
|
641
654
|
"input",
|
|
642
655
|
{
|
|
643
656
|
className: "ui-cmdk__input",
|
|
@@ -659,19 +672,19 @@ function CommandPalette({
|
|
|
659
672
|
}
|
|
660
673
|
)
|
|
661
674
|
] }),
|
|
662
|
-
/* @__PURE__ */
|
|
675
|
+
/* @__PURE__ */ jsx10("div", { className: "ui-cmdk__list", id: listId, role: "listbox", "aria-label": `${label} results`, children: shown.map((group, gi) => /* @__PURE__ */ jsxs8(
|
|
663
676
|
"div",
|
|
664
677
|
{
|
|
665
678
|
className: "ui-cmdk__group",
|
|
666
679
|
role: "group",
|
|
667
680
|
"aria-labelledby": group.label ? `${uid}-g${gi}` : void 0,
|
|
668
681
|
children: [
|
|
669
|
-
group.label && /* @__PURE__ */
|
|
682
|
+
group.label && /* @__PURE__ */ jsx10("div", { className: "ui-cmdk__group-head", id: `${uid}-g${gi}`, children: group.label }),
|
|
670
683
|
group.items.map((item) => {
|
|
671
684
|
const disabled = isDisabled(item);
|
|
672
685
|
const id = `${uid}-o${n++}`;
|
|
673
686
|
const on = item === active;
|
|
674
|
-
return /* @__PURE__ */
|
|
687
|
+
return /* @__PURE__ */ jsxs8(
|
|
675
688
|
"div",
|
|
676
689
|
{
|
|
677
690
|
id,
|
|
@@ -691,13 +704,13 @@ function CommandPalette({
|
|
|
691
704
|
},
|
|
692
705
|
onClick: (e) => run(item, e.metaKey || e.ctrlKey),
|
|
693
706
|
children: [
|
|
694
|
-
item.icon && /* @__PURE__ */
|
|
695
|
-
/* @__PURE__ */
|
|
696
|
-
/* @__PURE__ */
|
|
697
|
-
item.description && /* @__PURE__ */
|
|
707
|
+
item.icon && /* @__PURE__ */ jsx10(Glyph, { name: item.icon, className: "ui-cmdk__ic" }),
|
|
708
|
+
/* @__PURE__ */ jsxs8("span", { className: "ui-cmdk__main", children: [
|
|
709
|
+
/* @__PURE__ */ jsx10("span", { className: "ui-cmdk__label", children: item.label }),
|
|
710
|
+
item.description && /* @__PURE__ */ jsx10("span", { className: "ui-cmdk__desc", children: item.description })
|
|
698
711
|
] }),
|
|
699
|
-
item.badge && /* @__PURE__ */
|
|
700
|
-
keysOf(item.shortcut).length > 0 && /* @__PURE__ */
|
|
712
|
+
item.badge && /* @__PURE__ */ jsx10("span", { className: "ui-cmdk__badge", children: item.badge }),
|
|
713
|
+
keysOf(item.shortcut).length > 0 && /* @__PURE__ */ jsx10("span", { className: "ui-cmdk__keys", "aria-hidden": "true", children: keysOf(item.shortcut).map((k) => /* @__PURE__ */ jsx10("kbd", { className: "ui-cmdk__key", children: k }, k)) })
|
|
701
714
|
]
|
|
702
715
|
},
|
|
703
716
|
item.id
|
|
@@ -707,20 +720,20 @@ function CommandPalette({
|
|
|
707
720
|
},
|
|
708
721
|
group.label ?? `g${gi}`
|
|
709
722
|
)) }),
|
|
710
|
-
/* @__PURE__ */
|
|
711
|
-
/* @__PURE__ */
|
|
712
|
-
hint && /* @__PURE__ */
|
|
713
|
-
/* @__PURE__ */
|
|
714
|
-
/* @__PURE__ */
|
|
715
|
-
/* @__PURE__ */
|
|
723
|
+
/* @__PURE__ */ jsx10("p", { className: "ui-cmdk__empty", hidden: countOf(shown) > 0, children: empty }),
|
|
724
|
+
/* @__PURE__ */ jsx10("p", { className: "ui-sr", role: "status", "aria-live": "polite", children: countOf(shown) === 0 ? "No results" : `${countOf(shown)} result${countOf(shown) === 1 ? "" : "s"}` }),
|
|
725
|
+
hint && /* @__PURE__ */ jsxs8("div", { className: "ui-cmdk__foot", "aria-hidden": "true", children: [
|
|
726
|
+
/* @__PURE__ */ jsxs8("span", { children: [
|
|
727
|
+
/* @__PURE__ */ jsx10("kbd", { className: "ui-cmdk__key", children: "\u2191" }),
|
|
728
|
+
/* @__PURE__ */ jsx10("kbd", { className: "ui-cmdk__key", children: "\u2193" }),
|
|
716
729
|
" move"
|
|
717
730
|
] }),
|
|
718
|
-
/* @__PURE__ */
|
|
719
|
-
/* @__PURE__ */
|
|
731
|
+
/* @__PURE__ */ jsxs8("span", { children: [
|
|
732
|
+
/* @__PURE__ */ jsx10("kbd", { className: "ui-cmdk__key", children: "\u21B5" }),
|
|
720
733
|
" run"
|
|
721
734
|
] }),
|
|
722
|
-
/* @__PURE__ */
|
|
723
|
-
/* @__PURE__ */
|
|
735
|
+
/* @__PURE__ */ jsxs8("span", { children: [
|
|
736
|
+
/* @__PURE__ */ jsx10("kbd", { className: "ui-cmdk__key", children: "esc" }),
|
|
724
737
|
" close"
|
|
725
738
|
] })
|
|
726
739
|
] })
|
|
@@ -751,7 +764,7 @@ import { DEFAULT_PAGE_SIZE as DEFAULT_PAGE_SIZE2 } from "@apliteni/apliteni-ui";
|
|
|
751
764
|
// src/Pagination.tsx
|
|
752
765
|
import { useEffect as useEffect3, useId as useId5, useRef as useRef7, useState as useState3 } from "react";
|
|
753
766
|
import { DEFAULT_PAGE_SIZE } from "@apliteni/apliteni-ui";
|
|
754
|
-
import { jsx as
|
|
767
|
+
import { jsx as jsx11, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
755
768
|
var GHOST_SM = "ui-btn ui-btn--ghost ui-btn--sm";
|
|
756
769
|
var VARIANTS = ["steps", "numbered", "jump"];
|
|
757
770
|
var cx3 = (...a) => a.filter(Boolean).join(" ");
|
|
@@ -843,7 +856,7 @@ function Pagination({
|
|
|
843
856
|
const step = (label_, target, disabled) => (
|
|
844
857
|
// A control at an end is disabled and stays where it is: removing it slides
|
|
845
858
|
// the next control under a pointer already travelling toward it.
|
|
846
|
-
/* @__PURE__ */
|
|
859
|
+
/* @__PURE__ */ jsx11(
|
|
847
860
|
"button",
|
|
848
861
|
{
|
|
849
862
|
type: "button",
|
|
@@ -882,14 +895,14 @@ function Pagination({
|
|
|
882
895
|
if (single) {
|
|
883
896
|
steps = null;
|
|
884
897
|
} else if (!counted) {
|
|
885
|
-
steps = /* @__PURE__ */
|
|
898
|
+
steps = /* @__PURE__ */ jsxs9("div", { className: "ui-pager__steps", children: [
|
|
886
899
|
step("Prev", Math.max(1, at - 1), atStart),
|
|
887
900
|
step("Next", at + 1, !hasMore)
|
|
888
901
|
] });
|
|
889
902
|
} else {
|
|
890
903
|
let middle = null;
|
|
891
904
|
if (kind === "numbered") {
|
|
892
|
-
middle = slotsFor(at, last).map((n, i) => n == null ? /* @__PURE__ */
|
|
905
|
+
middle = slotsFor(at, last).map((n, i) => n == null ? /* @__PURE__ */ jsx11("span", { className: "ui-pager__gap", "aria-hidden": "true", children: "\u2026" }, `gap${i}`) : /* @__PURE__ */ jsx11(
|
|
893
906
|
"button",
|
|
894
907
|
{
|
|
895
908
|
type: "button",
|
|
@@ -904,9 +917,9 @@ function Pagination({
|
|
|
904
917
|
n
|
|
905
918
|
));
|
|
906
919
|
} else if (kind === "jump") {
|
|
907
|
-
middle = /* @__PURE__ */
|
|
908
|
-
/* @__PURE__ */
|
|
909
|
-
/* @__PURE__ */
|
|
920
|
+
middle = /* @__PURE__ */ jsxs9("span", { className: "ui-pager__jump", children: [
|
|
921
|
+
/* @__PURE__ */ jsx11("label", { htmlFor: `${uid}-jump`, children: "Page" }),
|
|
922
|
+
/* @__PURE__ */ jsx11(
|
|
910
923
|
"input",
|
|
911
924
|
{
|
|
912
925
|
className: "ui-input ui-pager__jump-input",
|
|
@@ -929,13 +942,13 @@ function Pagination({
|
|
|
929
942
|
}
|
|
930
943
|
}
|
|
931
944
|
),
|
|
932
|
-
/* @__PURE__ */
|
|
945
|
+
/* @__PURE__ */ jsxs9("span", { className: "ui-pager__jump-of", children: [
|
|
933
946
|
"of ",
|
|
934
947
|
fmt(last)
|
|
935
948
|
] })
|
|
936
949
|
] });
|
|
937
950
|
}
|
|
938
|
-
steps = /* @__PURE__ */
|
|
951
|
+
steps = /* @__PURE__ */ jsxs9("div", { className: "ui-pager__steps", children: [
|
|
939
952
|
ends ? step("First", 1, atStart) : null,
|
|
940
953
|
step("Prev", Math.max(1, at - 1), atStart),
|
|
941
954
|
middle,
|
|
@@ -943,7 +956,7 @@ function Pagination({
|
|
|
943
956
|
ends ? step("Last", last, atEnd) : null
|
|
944
957
|
] });
|
|
945
958
|
}
|
|
946
|
-
return /* @__PURE__ */
|
|
959
|
+
return /* @__PURE__ */ jsxs9(
|
|
947
960
|
"nav",
|
|
948
961
|
{
|
|
949
962
|
ref: nav,
|
|
@@ -951,10 +964,10 @@ function Pagination({
|
|
|
951
964
|
"aria-label": label,
|
|
952
965
|
"aria-busy": loading ? true : void 0,
|
|
953
966
|
children: [
|
|
954
|
-
/* @__PURE__ */
|
|
955
|
-
sizes.length ? /* @__PURE__ */
|
|
956
|
-
/* @__PURE__ */
|
|
957
|
-
/* @__PURE__ */
|
|
967
|
+
/* @__PURE__ */ jsx11("p", { className: "ui-pager__status", "aria-live": "polite", "aria-atomic": "true", children: status }),
|
|
968
|
+
sizes.length ? /* @__PURE__ */ jsxs9("div", { className: "ui-pager__size", children: [
|
|
969
|
+
/* @__PURE__ */ jsx11("label", { className: "ui-pager__size-label", htmlFor: `${uid}-size`, children: "Rows" }),
|
|
970
|
+
/* @__PURE__ */ jsx11(
|
|
958
971
|
"select",
|
|
959
972
|
{
|
|
960
973
|
className: "ui-select ui-pager__size-select",
|
|
@@ -962,7 +975,7 @@ function Pagination({
|
|
|
962
975
|
disabled: loading,
|
|
963
976
|
value: size,
|
|
964
977
|
onChange: (e) => onPageSizeChange?.(Number(e.target.value)),
|
|
965
|
-
children: sizes.map((s) => /* @__PURE__ */
|
|
978
|
+
children: sizes.map((s) => /* @__PURE__ */ jsx11("option", { value: s, children: fmt(s) }, s))
|
|
966
979
|
}
|
|
967
980
|
)
|
|
968
981
|
] }) : null,
|
|
@@ -973,7 +986,7 @@ function Pagination({
|
|
|
973
986
|
}
|
|
974
987
|
|
|
975
988
|
// src/DataTable.tsx
|
|
976
|
-
import { Fragment as Fragment3, jsx as
|
|
989
|
+
import { Fragment as Fragment3, jsx as jsx12, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
977
990
|
var NO_SORT = { key: void 0, dir: -1 };
|
|
978
991
|
function sortTableRows(rows, sort) {
|
|
979
992
|
if (sort.key === void 0) return [...rows];
|
|
@@ -1040,7 +1053,7 @@ function DataTable({
|
|
|
1040
1053
|
onSortChange?.(next);
|
|
1041
1054
|
toFirstPage();
|
|
1042
1055
|
};
|
|
1043
|
-
const caret = (k) => /* @__PURE__ */
|
|
1056
|
+
const caret = (k) => /* @__PURE__ */ jsx12(
|
|
1044
1057
|
"svg",
|
|
1045
1058
|
{
|
|
1046
1059
|
className: "rx-caret",
|
|
@@ -1052,29 +1065,29 @@ function DataTable({
|
|
|
1052
1065
|
strokeLinejoin: "round",
|
|
1053
1066
|
"aria-hidden": "true",
|
|
1054
1067
|
focusable: "false",
|
|
1055
|
-
children: sort.key === k ? /* @__PURE__ */
|
|
1056
|
-
/* @__PURE__ */
|
|
1057
|
-
/* @__PURE__ */
|
|
1068
|
+
children: sort.key === k ? /* @__PURE__ */ jsx12("path", { d: "m8 10 4 4 4-4" }) : /* @__PURE__ */ jsxs10(Fragment3, { children: [
|
|
1069
|
+
/* @__PURE__ */ jsx12("path", { d: "m8 9 4-4 4 4" }),
|
|
1070
|
+
/* @__PURE__ */ jsx12("path", { d: "m8 15 4 4 4-4" })
|
|
1058
1071
|
] })
|
|
1059
1072
|
}
|
|
1060
1073
|
);
|
|
1061
1074
|
const pageAllOn = selectable && slice.length > 0 && slice.every((r) => selected.has(r.name));
|
|
1062
|
-
return /* @__PURE__ */
|
|
1063
|
-
/* @__PURE__ */
|
|
1075
|
+
return /* @__PURE__ */ jsxs10(Fragment3, { children: [
|
|
1076
|
+
/* @__PURE__ */ jsx12(
|
|
1064
1077
|
"div",
|
|
1065
1078
|
{
|
|
1066
1079
|
className: stickyHeader || pinnedIdentity ? "ui-table-scroll" : void 0,
|
|
1067
1080
|
role: stickyHeader || pinnedIdentity ? "region" : void 0,
|
|
1068
1081
|
"aria-label": stickyHeader || pinnedIdentity ? scrollLabel : void 0,
|
|
1069
1082
|
tabIndex: stickyHeader || pinnedIdentity ? 0 : void 0,
|
|
1070
|
-
children: /* @__PURE__ */
|
|
1083
|
+
children: /* @__PURE__ */ jsxs10(
|
|
1071
1084
|
"table",
|
|
1072
1085
|
{
|
|
1073
1086
|
className: ["ui-table ui-table--hover", (density === "dense" || !density && dense) && "ui-table--dense", density === "compact" && "ui-table--compact", stickyHeader && "ui-table--sticky", pinnedIdentity && "ui-table--pinned"].filter(Boolean).join(" "),
|
|
1074
1087
|
"aria-busy": loading || void 0,
|
|
1075
1088
|
children: [
|
|
1076
|
-
/* @__PURE__ */
|
|
1077
|
-
selectable ? /* @__PURE__ */
|
|
1089
|
+
/* @__PURE__ */ jsx12("thead", { children: /* @__PURE__ */ jsxs10("tr", { children: [
|
|
1090
|
+
selectable ? /* @__PURE__ */ jsx12("th", { scope: "col", className: "ui-table__selection", children: /* @__PURE__ */ jsx12(
|
|
1078
1091
|
"input",
|
|
1079
1092
|
{
|
|
1080
1093
|
type: "checkbox",
|
|
@@ -1087,13 +1100,13 @@ function DataTable({
|
|
|
1087
1100
|
// The sort control is a real <button> inside the header cell. It used to be
|
|
1088
1101
|
// role="button" ON the <th>, which threw away the columnheader role and put
|
|
1089
1102
|
// aria-sort on a role that forbids it.
|
|
1090
|
-
/* @__PURE__ */
|
|
1103
|
+
/* @__PURE__ */ jsx12(
|
|
1091
1104
|
"th",
|
|
1092
1105
|
{
|
|
1093
1106
|
scope: "col",
|
|
1094
1107
|
className: [pinnedIdentity && columnIndex === 0 && "ui-table__identity", c.num && "ui-table__num", c.sortable && "rx-sortable"].filter(Boolean).join(" "),
|
|
1095
1108
|
"aria-sort": sort.key === c.key ? sort.dir === 1 ? "ascending" : "descending" : c.sortable && sortIsKnown ? "none" : void 0,
|
|
1096
|
-
children: c.sortable ? /* @__PURE__ */
|
|
1109
|
+
children: c.sortable ? /* @__PURE__ */ jsxs10("button", { type: "button", className: "rx-sort", onClick: () => onSort(c.key), children: [
|
|
1097
1110
|
c.label,
|
|
1098
1111
|
caret(c.key)
|
|
1099
1112
|
] }) : c.label
|
|
@@ -1102,10 +1115,10 @@ function DataTable({
|
|
|
1102
1115
|
)
|
|
1103
1116
|
))
|
|
1104
1117
|
] }) }),
|
|
1105
|
-
/* @__PURE__ */
|
|
1106
|
-
!slice.length && /* @__PURE__ */
|
|
1107
|
-
slice.map((r) => /* @__PURE__ */
|
|
1108
|
-
selectable ? /* @__PURE__ */
|
|
1118
|
+
/* @__PURE__ */ jsxs10("tbody", { children: [
|
|
1119
|
+
!slice.length && /* @__PURE__ */ jsx12("tr", { children: /* @__PURE__ */ jsx12("td", { colSpan: columns.length + (selectable ? 1 : 0), children: loading ? "Loading rows\u2026" : empty }) }),
|
|
1120
|
+
slice.map((r) => /* @__PURE__ */ jsxs10("tr", { children: [
|
|
1121
|
+
selectable ? /* @__PURE__ */ jsx12("td", { className: "ui-table__selection", children: /* @__PURE__ */ jsx12(
|
|
1109
1122
|
"input",
|
|
1110
1123
|
{
|
|
1111
1124
|
type: "checkbox",
|
|
@@ -1114,7 +1127,7 @@ function DataTable({
|
|
|
1114
1127
|
onChange: () => onToggle(r.name)
|
|
1115
1128
|
}
|
|
1116
1129
|
) }) : null,
|
|
1117
|
-
columns.map((c, columnIndex) => /* @__PURE__ */
|
|
1130
|
+
columns.map((c, columnIndex) => /* @__PURE__ */ jsx12("td", { className: [c.num && "ui-table__num", pinnedIdentity && columnIndex === 0 && "ui-table__identity"].filter(Boolean).join(" "), children: c.render ? c.render(r) : String(r[c.key]) }, c.key))
|
|
1118
1131
|
] }, r.name))
|
|
1119
1132
|
] })
|
|
1120
1133
|
]
|
|
@@ -1122,7 +1135,7 @@ function DataTable({
|
|
|
1122
1135
|
)
|
|
1123
1136
|
}
|
|
1124
1137
|
),
|
|
1125
|
-
pager ? /* @__PURE__ */
|
|
1138
|
+
pager ? /* @__PURE__ */ jsx12(
|
|
1126
1139
|
Pagination,
|
|
1127
1140
|
{
|
|
1128
1141
|
page,
|
|
@@ -1147,7 +1160,7 @@ function DataTable({
|
|
|
1147
1160
|
import { PAGE_SIZES as KIT_PAGE_SIZES, DEFAULT_PAGE_SIZE as KIT_DEFAULT_PAGE_SIZE } from "@apliteni/apliteni-ui";
|
|
1148
1161
|
|
|
1149
1162
|
// src/Loading.tsx
|
|
1150
|
-
import { jsx as
|
|
1163
|
+
import { jsx as jsx13, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
1151
1164
|
var cx4 = (...a) => a.filter(Boolean).join(" ");
|
|
1152
1165
|
function Skeleton({ lines = 3, width, height, radius, className }) {
|
|
1153
1166
|
const widths = Array.isArray(lines) ? lines : null;
|
|
@@ -1157,19 +1170,19 @@ function Skeleton({ lines = 3, width, height, radius, className }) {
|
|
|
1157
1170
|
if (!w && !height && !radius) return void 0;
|
|
1158
1171
|
return { ...w && { width: w }, ...height && { height }, ...radius && { borderRadius: radius } };
|
|
1159
1172
|
};
|
|
1160
|
-
return /* @__PURE__ */
|
|
1173
|
+
return /* @__PURE__ */ jsx13("div", { className: cx4("ui-skel", className), "aria-hidden": "true", children: Array.from({ length: n }, (_, i) => /* @__PURE__ */ jsx13("span", { className: "ui-skel__bar m-skeleton", style: styleFor(i) }, i)) });
|
|
1161
1174
|
}
|
|
1162
1175
|
function SkeletonTable({ rows = 5, cols = 4, head = true }) {
|
|
1163
|
-
const cells = Array.from({ length: Math.max(1, cols) }, (_, i) => /* @__PURE__ */
|
|
1164
|
-
return /* @__PURE__ */
|
|
1176
|
+
const cells = Array.from({ length: Math.max(1, cols) }, (_, i) => /* @__PURE__ */ jsx13("span", { className: "ui-skel__bar m-skeleton" }, i));
|
|
1177
|
+
return /* @__PURE__ */ jsxs11(
|
|
1165
1178
|
"div",
|
|
1166
1179
|
{
|
|
1167
1180
|
className: "ui-skel ui-skel--table",
|
|
1168
1181
|
style: { "--skel-cols": Math.max(1, cols) },
|
|
1169
1182
|
"aria-hidden": "true",
|
|
1170
1183
|
children: [
|
|
1171
|
-
head && /* @__PURE__ */
|
|
1172
|
-
Array.from({ length: Math.max(1, rows) }, (_, i) => /* @__PURE__ */
|
|
1184
|
+
head && /* @__PURE__ */ jsx13("div", { className: "ui-skel__row ui-skel__row--head", children: cells }),
|
|
1185
|
+
Array.from({ length: Math.max(1, rows) }, (_, i) => /* @__PURE__ */ jsx13("div", { className: "ui-skel__row", children: cells }, i))
|
|
1173
1186
|
]
|
|
1174
1187
|
}
|
|
1175
1188
|
);
|
|
@@ -1182,7 +1195,7 @@ function BusyRegion({
|
|
|
1182
1195
|
className,
|
|
1183
1196
|
children
|
|
1184
1197
|
}) {
|
|
1185
|
-
return /* @__PURE__ */
|
|
1198
|
+
return /* @__PURE__ */ jsxs11(
|
|
1186
1199
|
"div",
|
|
1187
1200
|
{
|
|
1188
1201
|
className: cx4("ui-busy", className),
|
|
@@ -1190,8 +1203,8 @@ function BusyRegion({
|
|
|
1190
1203
|
"aria-live": "polite",
|
|
1191
1204
|
"aria-busy": busy,
|
|
1192
1205
|
children: [
|
|
1193
|
-
/* @__PURE__ */
|
|
1194
|
-
/* @__PURE__ */
|
|
1206
|
+
/* @__PURE__ */ jsx13("span", { className: "ui-sr", children: busy ? label : message }),
|
|
1207
|
+
/* @__PURE__ */ jsx13("div", { className: "ui-busy__body", children: busy ? placeholder ?? /* @__PURE__ */ jsx13(Skeleton, { lines: 3 }) : children })
|
|
1195
1208
|
]
|
|
1196
1209
|
}
|
|
1197
1210
|
);
|
|
@@ -1204,15 +1217,15 @@ function Denied({
|
|
|
1204
1217
|
className,
|
|
1205
1218
|
children
|
|
1206
1219
|
}) {
|
|
1207
|
-
return /* @__PURE__ */
|
|
1208
|
-
/* @__PURE__ */
|
|
1209
|
-
/* @__PURE__ */
|
|
1210
|
-
sub && /* @__PURE__ */
|
|
1211
|
-
need && /* @__PURE__ */
|
|
1220
|
+
return /* @__PURE__ */ jsxs11("div", { className: cx4("ui-denied", className), children: [
|
|
1221
|
+
/* @__PURE__ */ jsx13("div", { className: "ui-denied__seal", children: /* @__PURE__ */ jsx13(Icon, { name: icon5 }) }),
|
|
1222
|
+
/* @__PURE__ */ jsx13("div", { className: "ui-denied__title", children: title }),
|
|
1223
|
+
sub && /* @__PURE__ */ jsx13("div", { className: "ui-denied__sub", children: sub }),
|
|
1224
|
+
need && /* @__PURE__ */ jsxs11("div", { className: "ui-denied__need", children: [
|
|
1212
1225
|
"Needs ",
|
|
1213
|
-
/* @__PURE__ */
|
|
1226
|
+
/* @__PURE__ */ jsx13("code", { className: "ui-code", children: need })
|
|
1214
1227
|
] }),
|
|
1215
|
-
children && /* @__PURE__ */
|
|
1228
|
+
children && /* @__PURE__ */ jsx13("div", { className: "ui-denied__actions", children })
|
|
1216
1229
|
] });
|
|
1217
1230
|
}
|
|
1218
1231
|
|
|
@@ -1226,10 +1239,10 @@ import {
|
|
|
1226
1239
|
useState as useState5
|
|
1227
1240
|
} from "react";
|
|
1228
1241
|
import { icon as icon3, dropdownMatch, dropdownFiltering } from "@apliteni/apliteni-ui";
|
|
1229
|
-
import { Fragment as Fragment5, jsx as
|
|
1242
|
+
import { Fragment as Fragment5, jsx as jsx14, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
1230
1243
|
var cx5 = (...a) => a.filter(Boolean).join(" ");
|
|
1231
1244
|
var isRow = (it) => Boolean(it) && it !== "---" && !it.separator;
|
|
1232
|
-
var Glyph2 = ({ name, className, hidden }) => /* @__PURE__ */
|
|
1245
|
+
var Glyph2 = ({ name, className, hidden }) => /* @__PURE__ */ jsx14(
|
|
1233
1246
|
"span",
|
|
1234
1247
|
{
|
|
1235
1248
|
className,
|
|
@@ -1242,7 +1255,7 @@ function RowBadge({ badge }) {
|
|
|
1242
1255
|
const given = typeof badge === "string" ? "" : badge.tone || "";
|
|
1243
1256
|
let tone = given || (/^live$/i.test(String(text2)) ? "live" : "neutral");
|
|
1244
1257
|
if (!given && tone === "neutral" && /^(?:off|unset|disabled|archive|archived)$/i.test(text2)) tone = "state";
|
|
1245
|
-
return /* @__PURE__ */
|
|
1258
|
+
return /* @__PURE__ */ jsx14("span", { className: `ui-dropdown__badge is-${tone}`, children: text2 });
|
|
1246
1259
|
}
|
|
1247
1260
|
var keyOf = (it) => it.value != null ? `v:${it.value}` : `l:${it.label}`;
|
|
1248
1261
|
var itemsIn = (panel) => Array.from(panel?.querySelectorAll("[data-dd-item]") ?? []).filter((el) => el.getAttribute("aria-disabled") !== "true" && !el.hidden);
|
|
@@ -1457,7 +1470,7 @@ function Dropdown({
|
|
|
1457
1470
|
};
|
|
1458
1471
|
function renderRow(entry, key) {
|
|
1459
1472
|
if (!isRow(entry)) {
|
|
1460
|
-
return /* @__PURE__ */
|
|
1473
|
+
return /* @__PURE__ */ jsx14("div", { className: "ui-dropdown__sep", role: "separator", hidden: filtering || void 0 }, key);
|
|
1461
1474
|
}
|
|
1462
1475
|
const disabled = !!entry.disabled;
|
|
1463
1476
|
const selected = selectedOf(entry);
|
|
@@ -1479,23 +1492,23 @@ function Dropdown({
|
|
|
1479
1492
|
...asLink ? { href: entry.href, ...entry.target ? { target: entry.target } : null } : null,
|
|
1480
1493
|
...sx ? { id: rowIds.get(entry), hidden: hiddenBy(entry) || void 0 } : null,
|
|
1481
1494
|
onClick: (e) => choose(entry, e),
|
|
1482
|
-
children: /* @__PURE__ */
|
|
1483
|
-
entry.icon && /* @__PURE__ */
|
|
1484
|
-
/* @__PURE__ */
|
|
1485
|
-
/* @__PURE__ */
|
|
1486
|
-
entry.description && /* @__PURE__ */
|
|
1495
|
+
children: /* @__PURE__ */ jsxs12(Fragment5, { children: [
|
|
1496
|
+
entry.icon && /* @__PURE__ */ jsx14(Glyph2, { name: entry.icon, className: "ui-dropdown__ic" }),
|
|
1497
|
+
/* @__PURE__ */ jsxs12("span", { className: "ui-dropdown__main", children: [
|
|
1498
|
+
/* @__PURE__ */ jsx14("span", { className: "ui-dropdown__label", children: entry.label }),
|
|
1499
|
+
entry.description && /* @__PURE__ */ jsx14("span", { className: "ui-dropdown__desc", children: entry.description })
|
|
1487
1500
|
] }),
|
|
1488
|
-
entry.badge ? /* @__PURE__ */
|
|
1489
|
-
asOption && /* @__PURE__ */
|
|
1501
|
+
entry.badge ? /* @__PURE__ */ jsx14(RowBadge, { badge: entry.badge }) : null,
|
|
1502
|
+
asOption && /* @__PURE__ */ jsx14(Glyph2, { name: "check", className: "ui-dropdown__tick", hidden: true })
|
|
1490
1503
|
] })
|
|
1491
1504
|
};
|
|
1492
|
-
if (row) return /* @__PURE__ */
|
|
1505
|
+
if (row) return /* @__PURE__ */ jsx14(Fragment4, { children: row(entry, props) }, key);
|
|
1493
1506
|
const Tag = asLink ? "a" : "div";
|
|
1494
|
-
return /* @__PURE__ */
|
|
1507
|
+
return /* @__PURE__ */ jsx14(Tag, { ...props }, key);
|
|
1495
1508
|
}
|
|
1496
1509
|
const body = sections?.length ? sections.map((section, si) => {
|
|
1497
1510
|
const gone = filtering && !(section.items || []).some((it) => isRow(it) && !hiddenBy(it));
|
|
1498
|
-
return /* @__PURE__ */
|
|
1511
|
+
return /* @__PURE__ */ jsxs12(
|
|
1499
1512
|
"div",
|
|
1500
1513
|
{
|
|
1501
1514
|
className: "ui-dropdown__section",
|
|
@@ -1503,7 +1516,7 @@ function Dropdown({
|
|
|
1503
1516
|
"aria-label": section.label || void 0,
|
|
1504
1517
|
hidden: gone || void 0,
|
|
1505
1518
|
children: [
|
|
1506
|
-
section.label && /* @__PURE__ */
|
|
1519
|
+
section.label && /* @__PURE__ */ jsx14("div", { className: "ui-dropdown__group", role: "presentation", children: section.label }),
|
|
1507
1520
|
(section.items || []).map((entry, i) => renderRow(entry, `s${si}-${i}`))
|
|
1508
1521
|
]
|
|
1509
1522
|
},
|
|
@@ -1511,12 +1524,12 @@ function Dropdown({
|
|
|
1511
1524
|
);
|
|
1512
1525
|
}) : (items || []).map((entry, i) => renderRow(entry, `i${i}`));
|
|
1513
1526
|
const cap = scroll && scroll !== true ? { maxHeight: typeof scroll === "number" ? `${scroll}px` : scroll } : void 0;
|
|
1514
|
-
const none = sx && filtering && !visible.length ? /* @__PURE__ */
|
|
1515
|
-
/* @__PURE__ */
|
|
1516
|
-
/* @__PURE__ */
|
|
1527
|
+
const none = sx && filtering && !visible.length ? /* @__PURE__ */ jsxs12(Fragment5, { children: [
|
|
1528
|
+
/* @__PURE__ */ jsx14("span", { className: "ui-dropdown__none-title", children: sx.empty.replace("{q}", () => query.trim()) }),
|
|
1529
|
+
/* @__PURE__ */ jsx14("span", { className: "ui-dropdown__none-hint", children: sx.hint })
|
|
1517
1530
|
] }) : null;
|
|
1518
|
-
return /* @__PURE__ */
|
|
1519
|
-
/* @__PURE__ */
|
|
1531
|
+
return /* @__PURE__ */ jsxs12("div", { className: cx5("ui-dropdown", open && "open"), id, ref: root, onKeyDown, children: [
|
|
1532
|
+
/* @__PURE__ */ jsxs12(
|
|
1520
1533
|
"button",
|
|
1521
1534
|
{
|
|
1522
1535
|
type: "button",
|
|
@@ -1531,15 +1544,15 @@ function Dropdown({
|
|
|
1531
1544
|
setOpen(!open);
|
|
1532
1545
|
},
|
|
1533
1546
|
children: [
|
|
1534
|
-
triggerContent != null ? triggerContent : /* @__PURE__ */
|
|
1535
|
-
label && /* @__PURE__ */
|
|
1536
|
-
/* @__PURE__ */
|
|
1547
|
+
triggerContent != null ? triggerContent : /* @__PURE__ */ jsxs12(Fragment5, { children: [
|
|
1548
|
+
label && /* @__PURE__ */ jsx14("span", { className: "ui-dropdown__pre", children: label }),
|
|
1549
|
+
/* @__PURE__ */ jsx14("span", { className: "ui-dropdown__value", children: shown != null ? shown : placeholder })
|
|
1537
1550
|
] }),
|
|
1538
|
-
chevron && /* @__PURE__ */
|
|
1551
|
+
chevron && /* @__PURE__ */ jsx14("span", { className: "ui-dropdown__chevron", "aria-hidden": "true" })
|
|
1539
1552
|
]
|
|
1540
1553
|
}
|
|
1541
1554
|
),
|
|
1542
|
-
/* @__PURE__ */
|
|
1555
|
+
/* @__PURE__ */ jsxs12(
|
|
1543
1556
|
"div",
|
|
1544
1557
|
{
|
|
1545
1558
|
className: cx5(
|
|
@@ -1559,10 +1572,10 @@ function Dropdown({
|
|
|
1559
1572
|
onMouseMove,
|
|
1560
1573
|
children: [
|
|
1561
1574
|
header,
|
|
1562
|
-
sx ? /* @__PURE__ */
|
|
1563
|
-
/* @__PURE__ */
|
|
1564
|
-
/* @__PURE__ */
|
|
1565
|
-
/* @__PURE__ */
|
|
1575
|
+
sx ? /* @__PURE__ */ jsxs12(Fragment5, { children: [
|
|
1576
|
+
/* @__PURE__ */ jsxs12("div", { className: "ui-dropdown__search", children: [
|
|
1577
|
+
/* @__PURE__ */ jsx14(Glyph2, { name: "search", className: "ui-dropdown__search-ic", hidden: true }),
|
|
1578
|
+
/* @__PURE__ */ jsx14(
|
|
1566
1579
|
"input",
|
|
1567
1580
|
{
|
|
1568
1581
|
className: "ui-dropdown__search-input",
|
|
@@ -1586,8 +1599,8 @@ function Dropdown({
|
|
|
1586
1599
|
}
|
|
1587
1600
|
)
|
|
1588
1601
|
] }),
|
|
1589
|
-
/* @__PURE__ */
|
|
1590
|
-
/* @__PURE__ */
|
|
1602
|
+
/* @__PURE__ */ jsx14("div", { className: "ui-dropdown__list", role: "listbox", id: listId, "aria-label": name, style: cap, children: body }),
|
|
1603
|
+
/* @__PURE__ */ jsx14(
|
|
1591
1604
|
"div",
|
|
1592
1605
|
{
|
|
1593
1606
|
className: "ui-dropdown__none",
|
|
@@ -1612,7 +1625,7 @@ function strip(o) {
|
|
|
1612
1625
|
}
|
|
1613
1626
|
|
|
1614
1627
|
// src/BackLink.tsx
|
|
1615
|
-
import { jsx as
|
|
1628
|
+
import { jsx as jsx15, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
1616
1629
|
var BARE = "Back";
|
|
1617
1630
|
var SCRIPTED = /^javascript:/i;
|
|
1618
1631
|
var LEADING = /^[\u0000-\u0020]+/;
|
|
@@ -1631,7 +1644,7 @@ function BackLink({
|
|
|
1631
1644
|
const name = text(label).replace(SAID, "");
|
|
1632
1645
|
const bare = !name || name.toLowerCase() === BARE.toLowerCase();
|
|
1633
1646
|
const Tag = as ?? "a";
|
|
1634
|
-
return /* @__PURE__ */
|
|
1647
|
+
return /* @__PURE__ */ jsxs13(
|
|
1635
1648
|
Tag,
|
|
1636
1649
|
{
|
|
1637
1650
|
className: ["ui-back", className].filter(Boolean).join(" "),
|
|
@@ -1639,8 +1652,8 @@ function BackLink({
|
|
|
1639
1652
|
"aria-label": bare ? void 0 : `${BARE} to ${name}`,
|
|
1640
1653
|
...rest,
|
|
1641
1654
|
children: [
|
|
1642
|
-
/* @__PURE__ */
|
|
1643
|
-
/* @__PURE__ */
|
|
1655
|
+
/* @__PURE__ */ jsx15(Icon, { name: "chevronLeft" }),
|
|
1656
|
+
/* @__PURE__ */ jsx15("span", { className: "ui-back__label", children: bare ? BARE : name })
|
|
1644
1657
|
]
|
|
1645
1658
|
}
|
|
1646
1659
|
);
|
|
@@ -1648,36 +1661,36 @@ function BackLink({
|
|
|
1648
1661
|
|
|
1649
1662
|
// src/TableValues.tsx
|
|
1650
1663
|
import { numericValue, deltaValue } from "@apliteni/apliteni-ui";
|
|
1651
|
-
import { jsx as
|
|
1664
|
+
import { jsx as jsx16, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
1652
1665
|
function NumericValue(props) {
|
|
1653
|
-
return /* @__PURE__ */
|
|
1666
|
+
return /* @__PURE__ */ jsx16("span", { dangerouslySetInnerHTML: { __html: numericValue(props) } });
|
|
1654
1667
|
}
|
|
1655
1668
|
function DeltaValue(props) {
|
|
1656
|
-
return /* @__PURE__ */
|
|
1669
|
+
return /* @__PURE__ */ jsx16("span", { dangerouslySetInnerHTML: { __html: deltaValue(props) } });
|
|
1657
1670
|
}
|
|
1658
1671
|
function RowIdentity({ symbol, name, logo, href }) {
|
|
1659
1672
|
const Tag = href ? "a" : "span";
|
|
1660
|
-
return /* @__PURE__ */
|
|
1661
|
-
/* @__PURE__ */
|
|
1662
|
-
/* @__PURE__ */
|
|
1663
|
-
logo && /* @__PURE__ */
|
|
1673
|
+
return /* @__PURE__ */ jsxs14(Tag, { className: "ui-identity", href, children: [
|
|
1674
|
+
/* @__PURE__ */ jsxs14("span", { className: "ui-identity__logo", "aria-hidden": "true", children: [
|
|
1675
|
+
/* @__PURE__ */ jsx16("span", { children: symbol.slice(0, 1) }),
|
|
1676
|
+
logo && /* @__PURE__ */ jsx16("img", { src: logo, alt: "", onLoad: (e) => {
|
|
1664
1677
|
e.currentTarget.hidden = false;
|
|
1665
1678
|
}, onError: (e) => {
|
|
1666
1679
|
e.currentTarget.hidden = true;
|
|
1667
1680
|
} })
|
|
1668
1681
|
] }),
|
|
1669
|
-
/* @__PURE__ */
|
|
1670
|
-
/* @__PURE__ */
|
|
1682
|
+
/* @__PURE__ */ jsx16("span", { className: "ui-identity__symbol", children: symbol }),
|
|
1683
|
+
/* @__PURE__ */ jsx16("span", { className: "ui-identity__name", children: name })
|
|
1671
1684
|
] });
|
|
1672
1685
|
}
|
|
1673
1686
|
|
|
1674
1687
|
// src/Segmented.tsx
|
|
1675
1688
|
import { segmentedNextIndex } from "@apliteni/apliteni-ui";
|
|
1676
|
-
import { jsx as
|
|
1689
|
+
import { jsx as jsx17 } from "react/jsx-runtime";
|
|
1677
1690
|
function Segmented({ options, value, onChange, label, appearance = "pill", disabled = false }) {
|
|
1678
1691
|
const enabled = options.filter((o) => !o.disabled);
|
|
1679
1692
|
const tabValue = enabled.some((o) => o.value === value) ? value : enabled[0]?.value;
|
|
1680
|
-
return /* @__PURE__ */
|
|
1693
|
+
return /* @__PURE__ */ jsx17("div", { className: `ui-seg${appearance === "underline" ? " ui-seg--underline" : ""}`, role: "toolbar", "aria-label": label, children: options.map((option) => /* @__PURE__ */ jsx17(
|
|
1681
1694
|
"button",
|
|
1682
1695
|
{
|
|
1683
1696
|
type: "button",
|
|
@@ -1704,7 +1717,7 @@ function Segmented({ options, value, onChange, label, appearance = "pill", disab
|
|
|
1704
1717
|
// src/FilterBar.tsx
|
|
1705
1718
|
import { useLayoutEffect as useLayoutEffect3, useRef as useRef9 } from "react";
|
|
1706
1719
|
import { filterBar, initFilterBar } from "@apliteni/apliteni-ui";
|
|
1707
|
-
import { jsx as
|
|
1720
|
+
import { jsx as jsx18 } from "react/jsx-runtime";
|
|
1708
1721
|
function FilterBar(props) {
|
|
1709
1722
|
const host = useRef9(null);
|
|
1710
1723
|
const latest = useRef9(props);
|
|
@@ -1733,36 +1746,36 @@ function FilterBar(props) {
|
|
|
1733
1746
|
useLayoutEffect3(() => {
|
|
1734
1747
|
controller.current?.update(props);
|
|
1735
1748
|
}, [props.filters, props.label, props.clearLabel, props.disabled, props.busy]);
|
|
1736
|
-
return /* @__PURE__ */
|
|
1749
|
+
return /* @__PURE__ */ jsx18("div", { ref: host, dangerouslySetInnerHTML: initial.current });
|
|
1737
1750
|
}
|
|
1738
1751
|
|
|
1739
1752
|
// src/KeyValueList.tsx
|
|
1740
|
-
import { jsx as
|
|
1753
|
+
import { jsx as jsx19, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
1741
1754
|
function detail({ value, redacted }) {
|
|
1742
|
-
if (redacted) return /* @__PURE__ */
|
|
1743
|
-
/* @__PURE__ */
|
|
1755
|
+
if (redacted) return /* @__PURE__ */ jsxs15("span", { className: "ui-kv__hidden", children: [
|
|
1756
|
+
/* @__PURE__ */ jsx19(Icon, { name: "eyeOff" }),
|
|
1744
1757
|
"Hidden"
|
|
1745
1758
|
] });
|
|
1746
1759
|
if (value == null) return "\u2014";
|
|
1747
1760
|
return typeof value === "boolean" ? String(value) : value;
|
|
1748
1761
|
}
|
|
1749
1762
|
function KeyValueList({ rows, columns = 1, className, ...rest }) {
|
|
1750
|
-
return /* @__PURE__ */
|
|
1751
|
-
/* @__PURE__ */
|
|
1752
|
-
/* @__PURE__ */
|
|
1763
|
+
return /* @__PURE__ */ jsx19("dl", { ...rest, className: ["ui-drawer__rows", "ui-kv", columns === 2 && "ui-kv--two-columns", className].filter(Boolean).join(" "), children: rows.map((row, index) => /* @__PURE__ */ jsxs15("div", { className: "ui-drawer__row", children: [
|
|
1764
|
+
/* @__PURE__ */ jsx19("dt", { children: row.label }),
|
|
1765
|
+
/* @__PURE__ */ jsx19("dd", { children: detail(row) })
|
|
1753
1766
|
] }, index)) });
|
|
1754
1767
|
}
|
|
1755
1768
|
function DrawerSection({ title, headingLevel = 3, className, children, ...rest }) {
|
|
1756
1769
|
const Heading = `h${headingLevel}`;
|
|
1757
|
-
return /* @__PURE__ */
|
|
1758
|
-
title != null && /* @__PURE__ */
|
|
1770
|
+
return /* @__PURE__ */ jsxs15("section", { ...rest, className: ["ui-drawer__section", className].filter(Boolean).join(" "), children: [
|
|
1771
|
+
title != null && /* @__PURE__ */ jsx19(Heading, { className: "ui-drawer__section-title", children: title }),
|
|
1759
1772
|
children
|
|
1760
1773
|
] });
|
|
1761
1774
|
}
|
|
1762
1775
|
|
|
1763
1776
|
// src/Snippet.tsx
|
|
1764
1777
|
import { useEffect as useEffect5, useRef as useRef10, useState as useState6 } from "react";
|
|
1765
|
-
import { jsx as
|
|
1778
|
+
import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
1766
1779
|
function Snippet({ label = "shell", code = "", reveal = false, copyLabel = "Copy" }) {
|
|
1767
1780
|
const [status, setStatus] = useState6("idle");
|
|
1768
1781
|
const request = useRef10(0);
|
|
@@ -1787,22 +1800,22 @@ function Snippet({ label = "shell", code = "", reveal = false, copyLabel = "Copy
|
|
|
1787
1800
|
if (current === request.current) setStatus("failed");
|
|
1788
1801
|
}
|
|
1789
1802
|
}
|
|
1790
|
-
return /* @__PURE__ */
|
|
1791
|
-
/* @__PURE__ */
|
|
1792
|
-
/* @__PURE__ */
|
|
1793
|
-
/* @__PURE__ */
|
|
1794
|
-
/* @__PURE__ */
|
|
1803
|
+
return /* @__PURE__ */ jsxs16("div", { className: reveal ? "ui-snippet ui-snippet--reveal" : "ui-snippet", children: [
|
|
1804
|
+
/* @__PURE__ */ jsxs16("div", { className: "ui-snippet__bar", children: [
|
|
1805
|
+
/* @__PURE__ */ jsx20("span", { children: label }),
|
|
1806
|
+
/* @__PURE__ */ jsxs16("button", { type: "button", className: "ui-snippet__copy", "aria-live": "polite", "aria-atomic": "true", onClick: copy, children: [
|
|
1807
|
+
/* @__PURE__ */ jsx20(Icon, { name: status === "copied" ? "check" : "copy" }),
|
|
1795
1808
|
status === "copied" ? "Copied" : status === "failed" ? "Copy failed" : copyLabel
|
|
1796
1809
|
] })
|
|
1797
1810
|
] }),
|
|
1798
|
-
/* @__PURE__ */
|
|
1811
|
+
/* @__PURE__ */ jsx20("pre", { children: code })
|
|
1799
1812
|
] });
|
|
1800
1813
|
}
|
|
1801
1814
|
|
|
1802
1815
|
// src/Tabs.tsx
|
|
1803
1816
|
import { useEffect as useEffect6, useId as useId7, useRef as useRef11 } from "react";
|
|
1804
1817
|
import { playEntrance } from "@apliteni/apliteni-ui/motion";
|
|
1805
|
-
import { Fragment as Fragment6, jsx as
|
|
1818
|
+
import { Fragment as Fragment6, jsx as jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
1806
1819
|
function Tabs({ items, value, onChange, label }) {
|
|
1807
1820
|
const id = useId7();
|
|
1808
1821
|
const previous = useRef11(value);
|
|
@@ -1812,8 +1825,8 @@ function Tabs({ items, value, onChange, label }) {
|
|
|
1812
1825
|
if (previous.current !== value) playEntrance(activePanel.current);
|
|
1813
1826
|
previous.current = value;
|
|
1814
1827
|
}, [value]);
|
|
1815
|
-
return /* @__PURE__ */
|
|
1816
|
-
/* @__PURE__ */
|
|
1828
|
+
return /* @__PURE__ */ jsxs17("div", { className: "ui-tabs", children: [
|
|
1829
|
+
/* @__PURE__ */ jsx21("div", { className: "ui-tabs__list", role: "tablist", "aria-label": label, children: items.map((item, i) => /* @__PURE__ */ jsxs17(
|
|
1817
1830
|
"button",
|
|
1818
1831
|
{
|
|
1819
1832
|
type: "button",
|
|
@@ -1851,7 +1864,7 @@ function Tabs({ items, value, onChange, label }) {
|
|
|
1851
1864
|
},
|
|
1852
1865
|
children: [
|
|
1853
1866
|
item.label,
|
|
1854
|
-
item.count != null && /* @__PURE__ */
|
|
1867
|
+
item.count != null && /* @__PURE__ */ jsxs17(Fragment6, { children: [
|
|
1855
1868
|
" ",
|
|
1856
1869
|
item.count
|
|
1857
1870
|
] })
|
|
@@ -1859,7 +1872,7 @@ function Tabs({ items, value, onChange, label }) {
|
|
|
1859
1872
|
},
|
|
1860
1873
|
item.value
|
|
1861
1874
|
)) }),
|
|
1862
|
-
/* @__PURE__ */
|
|
1875
|
+
/* @__PURE__ */ jsx21("div", { className: "ui-tabs__panels", children: items.map((item, i) => /* @__PURE__ */ jsx21(
|
|
1863
1876
|
"div",
|
|
1864
1877
|
{
|
|
1865
1878
|
className: "ui-tabs__panel",
|
|
@@ -1877,17 +1890,17 @@ function Tabs({ items, value, onChange, label }) {
|
|
|
1877
1890
|
}
|
|
1878
1891
|
|
|
1879
1892
|
// src/Timeline.tsx
|
|
1880
|
-
import { jsx as
|
|
1893
|
+
import { jsx as jsx22, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
1881
1894
|
function Timeline({ events, className, ...rest }) {
|
|
1882
|
-
return /* @__PURE__ */
|
|
1883
|
-
/* @__PURE__ */
|
|
1884
|
-
/* @__PURE__ */
|
|
1885
|
-
/* @__PURE__ */
|
|
1895
|
+
return /* @__PURE__ */ jsx22("ol", { ...rest, role: "list", className: ["ui-timeline", className].filter(Boolean).join(" "), children: events.map((event) => /* @__PURE__ */ jsxs18("li", { className: "ui-timeline__event", children: [
|
|
1896
|
+
/* @__PURE__ */ jsxs18("div", { className: "ui-timeline__head", children: [
|
|
1897
|
+
/* @__PURE__ */ jsx22("span", { className: "ui-timeline__actor", children: event.actor }),
|
|
1898
|
+
/* @__PURE__ */ jsx22("time", { dateTime: event.dateTime, children: event.timestamp })
|
|
1886
1899
|
] }),
|
|
1887
|
-
/* @__PURE__ */
|
|
1888
|
-
(event.meta != null || event.undo) && /* @__PURE__ */
|
|
1889
|
-
event.meta != null && /* @__PURE__ */
|
|
1890
|
-
event.undo && /* @__PURE__ */
|
|
1900
|
+
/* @__PURE__ */ jsx22("p", { className: "ui-timeline__description", children: event.description }),
|
|
1901
|
+
(event.meta != null || event.undo) && /* @__PURE__ */ jsxs18("div", { className: "ui-timeline__meta", children: [
|
|
1902
|
+
event.meta != null && /* @__PURE__ */ jsx22("span", { children: event.meta }),
|
|
1903
|
+
event.undo && /* @__PURE__ */ jsx22(Button, { variant: "ghost", size: "xs", className: "ui-btn ui-btn--ghost ui-btn--xs ui-timeline__undo", "aria-label": event.undo.label, onClick: event.undo.onUndo, children: "Undo" })
|
|
1891
1904
|
] })
|
|
1892
1905
|
] }, event.id)) });
|
|
1893
1906
|
}
|
|
@@ -1895,15 +1908,15 @@ function Timeline({ events, className, ...rest }) {
|
|
|
1895
1908
|
// src/Field.tsx
|
|
1896
1909
|
import { useEffect as useEffect7, useId as useId8, useRef as useRef12, useState as useState7 } from "react";
|
|
1897
1910
|
import { esc, icon as icon4 } from "@apliteni/apliteni-ui";
|
|
1898
|
-
import { jsx as
|
|
1911
|
+
import { jsx as jsx23, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
1899
1912
|
function Frame({ id, label, hint, error, required, children }) {
|
|
1900
|
-
return /* @__PURE__ */
|
|
1901
|
-
/* @__PURE__ */
|
|
1913
|
+
return /* @__PURE__ */ jsxs19("div", { className: "ui-field", children: [
|
|
1914
|
+
/* @__PURE__ */ jsxs19("label", { className: "ui-field__label", htmlFor: id, children: [
|
|
1902
1915
|
label,
|
|
1903
|
-
required && /* @__PURE__ */
|
|
1916
|
+
required && /* @__PURE__ */ jsx23("span", { className: "ui-field__req", "aria-hidden": "true", children: "*" })
|
|
1904
1917
|
] }),
|
|
1905
1918
|
children,
|
|
1906
|
-
(error || hint) && /* @__PURE__ */
|
|
1919
|
+
(error || hint) && /* @__PURE__ */ jsx23(
|
|
1907
1920
|
"div",
|
|
1908
1921
|
{
|
|
1909
1922
|
id: `${id}-message`,
|
|
@@ -1920,7 +1933,7 @@ function TextField({ label, hint, error, required, type = "text", unit, classNam
|
|
|
1920
1933
|
const id = useId8();
|
|
1921
1934
|
const hasUnit = type === "number" && !!unit;
|
|
1922
1935
|
const describedBy = [error || hint ? `${id}-message` : "", hasUnit ? `${id}-unit` : ""].filter(Boolean).join(" ") || void 0;
|
|
1923
|
-
const control = /* @__PURE__ */
|
|
1936
|
+
const control = /* @__PURE__ */ jsx23(
|
|
1924
1937
|
"input",
|
|
1925
1938
|
{
|
|
1926
1939
|
...props,
|
|
@@ -1932,14 +1945,14 @@ function TextField({ label, hint, error, required, type = "text", unit, classNam
|
|
|
1932
1945
|
className: `ui-input${error ? " is-invalid" : ""} ${className}`
|
|
1933
1946
|
}
|
|
1934
1947
|
);
|
|
1935
|
-
return /* @__PURE__ */
|
|
1948
|
+
return /* @__PURE__ */ jsx23(Frame, { ...{ id, label, hint, error, required }, children: hasUnit ? /* @__PURE__ */ jsxs19("div", { className: "ui-field-number", children: [
|
|
1936
1949
|
control,
|
|
1937
|
-
/* @__PURE__ */
|
|
1950
|
+
/* @__PURE__ */ jsx23("span", { id: `${id}-unit`, className: "ui-field-number__unit", children: unit })
|
|
1938
1951
|
] }) : control });
|
|
1939
1952
|
}
|
|
1940
1953
|
function TextArea({ label, hint, error, required, className = "", ...props }) {
|
|
1941
1954
|
const id = useId8();
|
|
1942
|
-
return /* @__PURE__ */
|
|
1955
|
+
return /* @__PURE__ */ jsx23(Frame, { ...{ id, label, hint, error, required }, children: /* @__PURE__ */ jsx23(
|
|
1943
1956
|
"textarea",
|
|
1944
1957
|
{
|
|
1945
1958
|
rows: 4,
|
|
@@ -1952,7 +1965,7 @@ function TextArea({ label, hint, error, required, className = "", ...props }) {
|
|
|
1952
1965
|
}
|
|
1953
1966
|
function SelectField({ label, hint, error, required, className = "", children, ...props }) {
|
|
1954
1967
|
const id = useId8();
|
|
1955
|
-
return /* @__PURE__ */
|
|
1968
|
+
return /* @__PURE__ */ jsx23(Frame, { ...{ id, label, hint, error, required }, children: /* @__PURE__ */ jsx23(
|
|
1956
1969
|
"select",
|
|
1957
1970
|
{
|
|
1958
1971
|
...props,
|
|
@@ -1981,7 +1994,7 @@ function FileField({ label, hint, error, required, disabled, onFileChange, class
|
|
|
1981
1994
|
setFile(next);
|
|
1982
1995
|
onFileChange?.(next);
|
|
1983
1996
|
};
|
|
1984
|
-
return /* @__PURE__ */
|
|
1997
|
+
return /* @__PURE__ */ jsx23(Frame, { ...{ id, label, hint, error, required }, children: /* @__PURE__ */ jsxs19(
|
|
1985
1998
|
"div",
|
|
1986
1999
|
{
|
|
1987
2000
|
className: `ui-file${dragging && !disabled ? " is-dragging" : ""}${file ? " has-file" : ""}${error ? " is-invalid" : ""}${disabled ? " is-disabled" : ""}`,
|
|
@@ -2002,12 +2015,12 @@ function FileField({ label, hint, error, required, disabled, onFileChange, class
|
|
|
2002
2015
|
update(transfer.files[0]);
|
|
2003
2016
|
},
|
|
2004
2017
|
children: [
|
|
2005
|
-
/* @__PURE__ */
|
|
2006
|
-
/* @__PURE__ */
|
|
2007
|
-
/* @__PURE__ */
|
|
2008
|
-
/* @__PURE__ */
|
|
2009
|
-
/* @__PURE__ */
|
|
2010
|
-
/* @__PURE__ */
|
|
2018
|
+
/* @__PURE__ */ jsx23("span", { className: "ui-file__glyph", children: /* @__PURE__ */ jsx23(Icon, { name: "upload" }) }),
|
|
2019
|
+
/* @__PURE__ */ jsx23("div", { "aria-live": "polite", children: file ? file.name : "Drop a file here" }),
|
|
2020
|
+
/* @__PURE__ */ jsx23("div", { children: "or choose one from your device" }),
|
|
2021
|
+
/* @__PURE__ */ jsxs19("span", { className: "ui-file__choose", children: [
|
|
2022
|
+
/* @__PURE__ */ jsx23("span", { className: "ui-btn ui-btn--secondary ui-btn--sm", "aria-hidden": "true", "aria-disabled": disabled || void 0, children: file ? "Replace file" : "Choose file" }),
|
|
2023
|
+
/* @__PURE__ */ jsx23(
|
|
2011
2024
|
"input",
|
|
2012
2025
|
{
|
|
2013
2026
|
...props,
|
|
@@ -2029,7 +2042,7 @@ function FileField({ label, hint, error, required, disabled, onFileChange, class
|
|
|
2029
2042
|
// src/Toast.tsx
|
|
2030
2043
|
import { createContext as createContext2, useCallback as useCallback3, useContext as useContext2, useEffect as useEffect8, useRef as useRef13, useState as useState8 } from "react";
|
|
2031
2044
|
import { createPortal as createPortal4 } from "react-dom";
|
|
2032
|
-
import { jsx as
|
|
2045
|
+
import { jsx as jsx24, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
2033
2046
|
var Context = createContext2(null);
|
|
2034
2047
|
var glyphs = { success: "circleCheck", danger: "circleX", warn: "circleAlert", info: "info", neutral: "bolt" };
|
|
2035
2048
|
function useToast() {
|
|
@@ -2075,7 +2088,7 @@ function Notice({ notice, remove }) {
|
|
|
2075
2088
|
remaining.current = Math.max(0, remaining.current - (Date.now() - started));
|
|
2076
2089
|
};
|
|
2077
2090
|
}, [dismiss, leaving2, notice.action, paused]);
|
|
2078
|
-
return /* @__PURE__ */
|
|
2091
|
+
return /* @__PURE__ */ jsxs20(
|
|
2079
2092
|
"div",
|
|
2080
2093
|
{
|
|
2081
2094
|
ref: root,
|
|
@@ -2089,12 +2102,12 @@ function Notice({ notice, remove }) {
|
|
|
2089
2102
|
if (!event.currentTarget.contains(event.relatedTarget)) setFocused(false);
|
|
2090
2103
|
},
|
|
2091
2104
|
children: [
|
|
2092
|
-
/* @__PURE__ */
|
|
2093
|
-
/* @__PURE__ */
|
|
2094
|
-
/* @__PURE__ */
|
|
2095
|
-
notice.text && /* @__PURE__ */
|
|
2105
|
+
/* @__PURE__ */ jsx24("span", { className: "ui-toast__icon", children: /* @__PURE__ */ jsx24(Icon, { name: glyphs[tone] }) }),
|
|
2106
|
+
/* @__PURE__ */ jsxs20("div", { className: "ui-toast__body", children: [
|
|
2107
|
+
/* @__PURE__ */ jsx24("div", { className: "ui-toast__title", children: notice.title }),
|
|
2108
|
+
notice.text && /* @__PURE__ */ jsx24("div", { className: "ui-toast__text", children: notice.text })
|
|
2096
2109
|
] }),
|
|
2097
|
-
notice.action && /* @__PURE__ */
|
|
2110
|
+
notice.action && /* @__PURE__ */ jsx24(
|
|
2098
2111
|
"button",
|
|
2099
2112
|
{
|
|
2100
2113
|
type: "button",
|
|
@@ -2109,8 +2122,8 @@ function Notice({ notice, remove }) {
|
|
|
2109
2122
|
children: notice.action.label
|
|
2110
2123
|
}
|
|
2111
2124
|
),
|
|
2112
|
-
/* @__PURE__ */
|
|
2113
|
-
!notice.action && /* @__PURE__ */
|
|
2125
|
+
/* @__PURE__ */ jsx24("button", { type: "button", className: "ui-toast__close", "aria-label": "Dismiss", disabled: leaving2, onClick: dismiss, children: /* @__PURE__ */ jsx24(Icon, { name: "x" }) }),
|
|
2126
|
+
!notice.action && /* @__PURE__ */ jsx24(
|
|
2114
2127
|
"span",
|
|
2115
2128
|
{
|
|
2116
2129
|
className: "ui-toast__timer is-running",
|
|
@@ -2130,10 +2143,10 @@ function Toast({ children }) {
|
|
|
2130
2143
|
const remove = () => setEntries((current) => current.filter((entry) => entry.id !== id));
|
|
2131
2144
|
setEntries((current) => [...current, { id, notice, remove }]);
|
|
2132
2145
|
}, []);
|
|
2133
|
-
return /* @__PURE__ */
|
|
2146
|
+
return /* @__PURE__ */ jsxs20(Context.Provider, { value: push, children: [
|
|
2134
2147
|
children,
|
|
2135
2148
|
typeof document !== "undefined" && createPortal4(
|
|
2136
|
-
/* @__PURE__ */
|
|
2149
|
+
/* @__PURE__ */ jsx24("div", { className: "ui-toast-stack rx-toast-stack", children: entries.map((entry) => /* @__PURE__ */ jsx24(Notice, { notice: entry.notice, remove: entry.remove }, entry.id)) }),
|
|
2137
2150
|
document.body
|
|
2138
2151
|
)
|
|
2139
2152
|
] });
|
|
@@ -2147,6 +2160,7 @@ export {
|
|
|
2147
2160
|
Badge,
|
|
2148
2161
|
BusyRegion,
|
|
2149
2162
|
Button,
|
|
2163
|
+
Callout,
|
|
2150
2164
|
Card,
|
|
2151
2165
|
CommandPalette,
|
|
2152
2166
|
Confirm,
|
package/src/components/index.js
CHANGED
|
@@ -218,8 +218,10 @@ export function switchToggle({ checked = false, disabled = false, name, label =
|
|
|
218
218
|
}
|
|
219
219
|
|
|
220
220
|
// ---- Callout / toast / success ------------------------------------------
|
|
221
|
-
export
|
|
222
|
-
|
|
221
|
+
export const calloutIcons = { info: 'info', success: 'check', warn: 'alert', danger: 'alert', neutral: 'info' };
|
|
222
|
+
|
|
223
|
+
export function callout({ variant, icon: ic = calloutIcons[variant] || 'info', body, actions } = {}) {
|
|
224
|
+
return `<div class="${esc(cx('ui-callout', variant && variant !== 'neutral' && `ui-callout--${variant}`))}"><span class="ui-callout__icon">${icon(ic)}</span><div class="ui-callout__body">${body}${actions != null ? `<div class="ui-toolbar ui-callout__actions">${actions}</div>` : ''}</div></div>`;
|
|
223
225
|
}
|
|
224
226
|
// Default icon per status — overridable with `icon`. The circle family is not
|
|
225
227
|
// decoration: a circled glyph is a STATE the system reports, a bare one is an
|
package/src/styles/callout.css
CHANGED
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
line-height: 1.55;
|
|
13
13
|
color: var(--text);
|
|
14
14
|
}
|
|
15
|
+
.ui-callout__body { min-width: 0; overflow-wrap: break-word; }
|
|
16
|
+
.ui-callout__actions { margin-top: 15px; }
|
|
15
17
|
.ui-callout__icon { width: 18px; height: 18px; flex: none; margin-top: 1px; /* muted-ink: glyph — nonverbal callout icon */ color: var(--muted); }
|
|
16
18
|
.ui-callout__icon svg { width: 100%; height: 100%; stroke: currentColor; fill: none; stroke-width: 2.1; } /* 2.1 of a 24 box drawn at 18px = 1.58 CSS px, which is what buys the 3:1 graphic bar rather than the 4.5:1 text one. docs/specification.md#icons-and-glyphs */
|
|
17
19
|
.ui-callout b { color: var(--text); font-weight: var(--weight-semibold); }
|
|
@@ -21,6 +23,7 @@
|
|
|
21
23
|
.ui-callout--info .ui-callout__icon { color: var(--chip-info-ink); } /* the chip inks, not the raw signals: in light the raw signal cleared the graphic bar by a tenth on its own wash and read as a smudge, and a stroke is read the way text is. The two are the same value in dark by construction, so only light moves. #206 */
|
|
22
24
|
.ui-callout--success { --ring-gap: inherit; background: var(--glow-green); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */ }
|
|
23
25
|
.ui-callout--success .ui-callout__icon { color: var(--chip-success-ink); }
|
|
26
|
+
.ui-callout--success a { /* muted-ink: state — opaque accent/text blend keeps links above 4.5:1 on the success wash. */ color: color-mix(in srgb, var(--accent) 95%, var(--text)); }
|
|
24
27
|
.ui-callout--warn { --ring-gap: inherit; background: color-mix(in srgb, var(--amber) 13%, transparent); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */ }
|
|
25
28
|
.ui-callout--warn .ui-callout__icon { color: var(--chip-warn-ink); }
|
|
26
29
|
.ui-callout--danger { --ring-gap: inherit; background: var(--glow-pink); /* ring-gap: inherit — translucent wash retains the opaque containing gap. */ }
|