@exponential_app/eui 0.0.0-stage → 0.2.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/LICENSE +201 -0
- package/NOTICE +54 -0
- package/README.md +377 -2
- package/catalog/a11y.json +705 -0
- package/catalog/basic-map.json +104 -0
- package/catalog/code.json +58 -0
- package/catalog/core.catalog.json +5190 -0
- package/catalog/core.schema.json +24542 -0
- package/catalog/host.json +95 -0
- package/catalog/layout.json +20 -0
- package/catalog/limits.json +9 -0
- package/catalog/locale.json +48 -0
- package/catalog/macros.json +4152 -0
- package/catalog/recipes.json +64 -0
- package/catalog/strings.json +84 -0
- package/catalog/style.json +180 -0
- package/catalog/theme.schema.json +47754 -0
- package/catalog/tokens.json +47 -0
- package/conformance/README.md +218 -0
- package/conformance/baseline.ts +101 -0
- package/conformance/browser-page.ts +146 -0
- package/conformance/browser-suites.ts +699 -0
- package/conformance/compare.ts +201 -0
- package/conformance/dom.ts +97 -0
- package/conformance/dump.ts +163 -0
- package/conformance/fonts.json +157 -0
- package/conformance/manifest.json +233 -0
- package/conformance/parity-compare.ts +191 -0
- package/conformance/parity-report.schema.json +73 -0
- package/conformance/parity.ts +412 -0
- package/conformance/pixel.ts +177 -0
- package/conformance/primitives-page.ts +49 -0
- package/conformance/report.schema.json +66 -0
- package/conformance/run.ts +118 -0
- package/conformance/voice-wave-child.ts +102 -0
- package/dist/chunks/index-5fmaa0xq.js +8384 -0
- package/dist/chunks/index-5fmaa0xq.js.map +10 -0
- package/dist/chunks/index-62yzr94z.js +2784 -0
- package/dist/chunks/index-62yzr94z.js.map +10 -0
- package/dist/chunks/index-bg2jsgjq.js +8541 -0
- package/dist/chunks/index-bg2jsgjq.js.map +15 -0
- package/dist/chunks/index-fy7y2nz8.js +186 -0
- package/dist/chunks/index-fy7y2nz8.js.map +9 -0
- package/dist/chunks/index-gtk2gwsb.js +4555 -0
- package/dist/chunks/index-gtk2gwsb.js.map +31 -0
- package/dist/chunks/index-t6qz1770.js +95 -0
- package/dist/chunks/index-t6qz1770.js.map +11 -0
- package/dist/conformance.js +230462 -0
- package/dist/conformance.js.map +10 -0
- package/dist/entries/prompt.js +251 -0
- package/dist/entries/prompt.js.map +11 -0
- package/dist/entries/schema.js +1725 -0
- package/dist/entries/schema.js.map +11 -0
- package/dist/host/index.js +194 -0
- package/dist/host/index.js.map +9 -0
- package/dist/index.js +3840 -0
- package/dist/index.js.map +29 -0
- package/dist/types/src/a11y.d.ts +21 -0
- package/dist/types/src/animation.d.ts +76 -0
- package/dist/types/src/basic-map.d.ts +38 -0
- package/dist/types/src/builder.d.ts +50 -0
- package/dist/types/src/catalog.d.ts +54 -0
- package/dist/types/src/catalog.described.d.ts +33 -0
- package/dist/types/src/catalog.generated.d.ts +904 -0
- package/dist/types/src/chart.d.ts +46 -0
- package/dist/types/src/code.d.ts +44 -0
- package/dist/types/src/color.d.ts +20 -0
- package/dist/types/src/conformance.d.ts +39 -0
- package/dist/types/src/connector/app.d.ts +14 -0
- package/dist/types/src/connector/connector.d.ts +77 -0
- package/dist/types/src/connector/index.d.ts +4 -0
- package/dist/types/src/css.d.ts +27 -0
- package/dist/types/src/define.d.ts +66 -0
- package/dist/types/src/direction.d.ts +16 -0
- package/dist/types/src/dynamic.d.ts +161 -0
- package/dist/types/src/entries/prompt.d.ts +11 -0
- package/dist/types/src/entries/schema.d.ts +8 -0
- package/dist/types/src/expr.d.ts +71 -0
- package/dist/types/src/extension.d.ts +4 -0
- package/dist/types/src/format.d.ts +112 -0
- package/dist/types/src/geometry.d.ts +40 -0
- package/dist/types/src/host/contract.d.ts +225 -0
- package/dist/types/src/host/decoders.d.ts +61 -0
- package/dist/types/src/host/index.d.ts +15 -0
- package/dist/types/src/host/package.d.ts +102 -0
- package/dist/types/src/host/policy.d.ts +107 -0
- package/dist/types/src/host/record-store.d.ts +103 -0
- package/dist/types/src/host/records.d.ts +45 -0
- package/dist/types/src/host/router.d.ts +38 -0
- package/dist/types/src/host/runtime.d.ts +213 -0
- package/dist/types/src/host/signature.d.ts +52 -0
- package/dist/types/src/host/sources.d.ts +22 -0
- package/dist/types/src/host/tools.d.ts +42 -0
- package/dist/types/src/host/transports.d.ts +109 -0
- package/dist/types/src/index.d.ts +69 -0
- package/dist/types/src/layout.d.ts +20 -0
- package/dist/types/src/limits.d.ts +21 -0
- package/dist/types/src/list.d.ts +133 -0
- package/dist/types/src/locale.d.ts +22 -0
- package/dist/types/src/macros.d.ts +29 -0
- package/dist/types/src/overlay.d.ts +27 -0
- package/dist/types/src/prompt.d.ts +44 -0
- package/dist/types/src/qr-code.d.ts +30 -0
- package/dist/types/src/recipes.d.ts +17 -0
- package/dist/types/src/reducer.d.ts +41 -0
- package/dist/types/src/resizable.d.ts +38 -0
- package/dist/types/src/schema.d.ts +7 -0
- package/dist/types/src/strings.d.ts +13 -0
- package/dist/types/src/style.d.ts +201 -0
- package/dist/types/src/test-preload.d.ts +1 -0
- package/dist/types/src/text-shimmer.d.ts +24 -0
- package/dist/types/src/theme-types.d.ts +162 -0
- package/dist/types/src/theme.d.ts +75 -0
- package/dist/types/src/themes.d.ts +22 -0
- package/dist/types/src/tree-guides.d.ts +17 -0
- package/dist/types/src/types.d.ts +320 -0
- package/dist/types/src/validate.d.ts +31 -0
- package/dist/types/src/voice-wave.d.ts +181 -0
- package/dist/types/src/web/base-css.d.ts +1 -0
- package/dist/types/src/web/box-css.d.ts +63 -0
- package/dist/types/src/web/coerce.d.ts +32 -0
- package/dist/types/src/web/custom-icons.generated.d.ts +4 -0
- package/dist/types/src/web/data.d.ts +107 -0
- package/dist/types/src/web/dates.d.ts +12 -0
- package/dist/types/src/web/form.d.ts +44 -0
- package/dist/types/src/web/host-types.d.ts +126 -0
- package/dist/types/src/web/index.d.ts +35 -0
- package/dist/types/src/web/inputs.d.ts +55 -0
- package/dist/types/src/web/list.d.ts +16 -0
- package/dist/types/src/web/listbox.d.ts +14 -0
- package/dist/types/src/web/markdown.d.ts +96 -0
- package/dist/types/src/web/media.d.ts +63 -0
- package/dist/types/src/web/parts.d.ts +4 -0
- package/dist/types/src/web/primitives/alert-dialog.d.ts +10 -0
- package/dist/types/src/web/primitives/alert.d.ts +9 -0
- package/dist/types/src/web/primitives/avatar-color.d.ts +2 -0
- package/dist/types/src/web/primitives/avatar.d.ts +13 -0
- package/dist/types/src/web/primitives/badge.d.ts +10 -0
- package/dist/types/src/web/primitives/breadcrumb.d.ts +10 -0
- package/dist/types/src/web/primitives/button.d.ts +6 -0
- package/dist/types/src/web/primitives/calendar.d.ts +43 -0
- package/dist/types/src/web/primitives/card.d.ts +9 -0
- package/dist/types/src/web/primitives/checkbox.d.ts +5 -0
- package/dist/types/src/web/primitives/choice-tiles.d.ts +32 -0
- package/dist/types/src/web/primitives/cn.d.ts +3 -0
- package/dist/types/src/web/primitives/code-block.d.ts +24 -0
- package/dist/types/src/web/primitives/command.d.ts +134 -0
- package/dist/types/src/web/primitives/context-ring.d.ts +24 -0
- package/dist/types/src/web/primitives/dialog-arms.d.ts +6 -0
- package/dist/types/src/web/primitives/dialog.d.ts +24 -0
- package/dist/types/src/web/primitives/disclosure-header.d.ts +5 -0
- package/dist/types/src/web/primitives/dock.d.ts +42 -0
- package/dist/types/src/web/primitives/dropdown-menu.d.ts +14 -0
- package/dist/types/src/web/primitives/empty-state.d.ts +15 -0
- package/dist/types/src/web/primitives/glass-card.d.ts +4 -0
- package/dist/types/src/web/primitives/hover-card.d.ts +7 -0
- package/dist/types/src/web/primitives/icon-disc.d.ts +12 -0
- package/dist/types/src/web/primitives/index.d.ts +50 -0
- package/dist/types/src/web/primitives/input.d.ts +5 -0
- package/dist/types/src/web/primitives/kbd.d.ts +4 -0
- package/dist/types/src/web/primitives/label.d.ts +3 -0
- package/dist/types/src/web/primitives/measure.d.ts +16 -0
- package/dist/types/src/web/primitives/menu-surface.d.ts +17 -0
- package/dist/types/src/web/primitives/meter.d.ts +21 -0
- package/dist/types/src/web/primitives/popover.d.ts +3 -0
- package/dist/types/src/web/primitives/progress-ring.d.ts +5 -0
- package/dist/types/src/web/primitives/progress.d.ts +8 -0
- package/dist/types/src/web/primitives/scroll-area.d.ts +49 -0
- package/dist/types/src/web/primitives/segmented-control.d.ts +5 -0
- package/dist/types/src/web/primitives/select.d.ts +47 -0
- package/dist/types/src/web/primitives/separator.d.ts +3 -0
- package/dist/types/src/web/primitives/sheet-chrome.d.ts +4 -0
- package/dist/types/src/web/primitives/sheet.d.ts +20 -0
- package/dist/types/src/web/primitives/skeleton.d.ts +3 -0
- package/dist/types/src/web/primitives/spinner.d.ts +3 -0
- package/dist/types/src/web/primitives/switch.d.ts +4 -0
- package/dist/types/src/web/primitives/table.d.ts +11 -0
- package/dist/types/src/web/primitives/tabs.d.ts +13 -0
- package/dist/types/src/web/primitives/textarea.d.ts +3 -0
- package/dist/types/src/web/primitives/toast.d.ts +163 -0
- package/dist/types/src/web/primitives/tooltip.d.ts +3 -0
- package/dist/types/src/web/primitives/truncate.d.ts +7 -0
- package/dist/types/src/web/primitives/typeahead-portal.d.ts +12 -0
- package/dist/types/src/web/primitives/voice-wave.d.ts +50 -0
- package/dist/types/src/web/round5.d.ts +107 -0
- package/dist/types/src/web/share.d.ts +6 -0
- package/dist/types/src/web/table.d.ts +20 -0
- package/dist/types/src/web/theme-css.d.ts +69 -0
- package/dist/types/src/web/urls.d.ts +21 -0
- package/dist/web/index.js +2565 -0
- package/dist/web/index.js.map +28 -0
- package/dist/web/primitives/index.js +1476 -0
- package/dist/web/primitives/index.js.map +57 -0
- package/docs/components.generated.json +6783 -0
- package/docs/package-format.md +182 -0
- package/docs/round-1-contract.md +679 -0
- package/docs/round-2-contract.md +476 -0
- package/docs/round-3-contract.md +174 -0
- package/docs/round-5-contract.md +268 -0
- package/docs/themes.generated.json +3647 -0
- package/fixtures/animations.json +2890 -0
- package/fixtures/bench-list.json +58 -0
- package/fixtures/bind-time.json +54734 -0
- package/fixtures/catalog-basic-map.json +1692 -0
- package/fixtures/catalog-components.json +10293 -0
- package/fixtures/catalog-extension.json +620 -0
- package/fixtures/catalog-macros.json +51805 -0
- package/fixtures/code-tokens.json +1993 -0
- package/fixtures/conformance-baseline.json +59016 -0
- package/fixtures/conformance-cases.json +49 -0
- package/fixtures/conformance-known.json +2111 -0
- package/fixtures/control-geometry.json +5129 -0
- package/fixtures/dashboard.data.json +74 -0
- package/fixtures/dashboard.json +781 -0
- package/fixtures/demo-surface.json +47 -0
- package/fixtures/format.json +870 -0
- package/fixtures/host-package.json +1262 -0
- package/fixtures/host-policy.json +1209 -0
- package/fixtures/host-router.json +2034 -0
- package/fixtures/host-transport.json +590 -0
- package/fixtures/interactions-round1.json +1058 -0
- package/fixtures/kitchen-sink.expanded.json +11972 -0
- package/fixtures/kitchen-sink.json +3140 -0
- package/fixtures/layout-geometry-round1.json +7278 -0
- package/fixtures/layout-geometry.json +2072 -0
- package/fixtures/overlay-geometry.json +272 -0
- package/fixtures/pointer.json +89 -0
- package/fixtures/primitive-specimens.json +59 -0
- package/fixtures/prompt-budget.json +33 -0
- package/fixtures/qr-code.json +480 -0
- package/fixtures/resizable.json +714 -0
- package/fixtures/round4-contract.json +2985 -0
- package/fixtures/specimens.json +11168 -0
- package/fixtures/style-conditions.json +336 -0
- package/fixtures/template-items.json +2215 -0
- package/fixtures/text-direction.json +309 -0
- package/fixtures/text-shimmer.json +96 -0
- package/fixtures/theme-extends.json +573 -0
- package/fixtures/theme-invalid.json +1300 -0
- package/fixtures/theme-recipes.json +61762 -0
- package/fixtures/theme-resolved.json +25969 -0
- package/fixtures/toast-stack.json +215 -0
- package/fixtures/tree-guides.json +224 -0
- package/fixtures/virtual-list.json +733 -0
- package/fixtures/voice-wave.json +19236 -0
- package/generated/ExponentialUICatalog.generated.kt +67 -0
- package/generated/ExponentialUICatalog.generated.swift +67 -0
- package/generated/ExponentialUIThemes.generated.kt +23 -0
- package/generated/ExponentialUIThemes.generated.swift +23 -0
- package/generated/catalog.descriptions.generated.rs +6 -0
- package/generated/catalog.generated.rs +80 -0
- package/generated/catalog.themes.generated.rs +34 -0
- package/generated/core.descriptions.json +2726 -0
- package/generated/core.runtime.json +3944 -0
- package/package.json +87 -4
- package/themes/exponential.recipes.json +49 -0
- package/themes/exponential.theme.json +768 -0
- package/themes/neutral.theme.json +6178 -0
- package/themes/orange.theme.json +43 -0
- package/themes/playful.theme.json +219 -0
- package/vendor/a2ui/LICENSE.txt +203 -0
- package/vendor/a2ui/README.md +27 -0
- package/vendor/a2ui/v0_9/basic_catalog.json +1387 -0
- package/vendor/a2ui/v0_9/basic_catalog_rules.txt +5 -0
- package/vendor/a2ui/v0_9/client_capabilities.json +97 -0
- package/vendor/a2ui/v0_9/client_to_server.json +104 -0
- package/vendor/a2ui/v0_9/common_types.json +315 -0
- package/vendor/a2ui/v0_9/server_to_client.json +132 -0
- package/vendor/json-render/LICENSE.txt +201 -0
- package/vendor/json-render/README.md +13 -0
- package/vendor/nayuki-qr/LICENSE.txt +20 -0
- package/vendor/nayuki-qr/README.md +10 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export declare const SCROLL_AREA_CLASSES: {
|
|
2
|
+
readonly root: "relative";
|
|
3
|
+
readonly viewport: "size-full rounded-[inherit] transition-[color,box-shadow] outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1";
|
|
4
|
+
readonly scrollbar: "flex touch-none p-px transition-colors select-none";
|
|
5
|
+
readonly orientations: {
|
|
6
|
+
readonly vertical: "h-full w-2.5 border-l border-l-transparent";
|
|
7
|
+
readonly horizontal: "h-2.5 flex-col border-t border-t-transparent";
|
|
8
|
+
};
|
|
9
|
+
readonly thumb: "relative flex-1 rounded-full bg-border";
|
|
10
|
+
};
|
|
11
|
+
export type ScrollAreaDir = `ltr` | `rtl`;
|
|
12
|
+
export type ScrollAreaOrientation = `vertical` | `horizontal`;
|
|
13
|
+
/** Radix's viewport <style>: the native scrollbar hidden. */
|
|
14
|
+
export declare const SCROLL_AREA_VIEWPORT_CSS = "[data-radix-scroll-area-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-scroll-area-viewport]::-webkit-scrollbar{display:none}";
|
|
15
|
+
export declare function scrollAreaRootStyle(cornerWidth: number, cornerHeight: number): Record<string, string>;
|
|
16
|
+
export declare function scrollAreaViewportStyle(xEnabled: boolean, yEnabled: boolean): Record<string, string>;
|
|
17
|
+
/** The viewport's `display: table` sizer. */
|
|
18
|
+
export declare const SCROLL_AREA_CONTENT_STYLE: {
|
|
19
|
+
readonly "min-width": "100%";
|
|
20
|
+
readonly display: "table";
|
|
21
|
+
};
|
|
22
|
+
export declare function scrollAreaScrollbarStyle(orientation: ScrollAreaOrientation, dir: ScrollAreaDir, thumbSize: number): Record<string, string>;
|
|
23
|
+
export declare const SCROLL_AREA_THUMB_STYLE: {
|
|
24
|
+
readonly width: "var(--radix-scroll-area-thumb-width)";
|
|
25
|
+
readonly height: "var(--radix-scroll-area-thumb-height)";
|
|
26
|
+
};
|
|
27
|
+
export declare function scrollAreaCornerStyle(width: number, height: number, dir: ScrollAreaDir): Record<string, string>;
|
|
28
|
+
/** A scrollbar's / thumb's `data-state`. */
|
|
29
|
+
export declare const scrollAreaVisibility: (visible: boolean) => `visible` | `hidden`;
|
|
30
|
+
export type ScrollAreaScrollState = `hidden` | `scrolling` | `interacting` | `idle`;
|
|
31
|
+
/** Radix's `type="scroll"` machine. */
|
|
32
|
+
export declare const SCROLL_AREA_SCROLL_MACHINE: Record<ScrollAreaScrollState, Partial<Record<string, ScrollAreaScrollState>>>;
|
|
33
|
+
export declare const SCROLL_AREA_SCROLL_INITIAL: ScrollAreaScrollState;
|
|
34
|
+
export interface ScrollAreaSizes {
|
|
35
|
+
content: number;
|
|
36
|
+
viewport: number;
|
|
37
|
+
scrollbar: {
|
|
38
|
+
size: number;
|
|
39
|
+
paddingStart: number;
|
|
40
|
+
paddingEnd: number;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export declare const scrollAreaThumbRatio: (viewport: number, content: number) => number;
|
|
44
|
+
/** Radix's `getThumbSize`: the ratio of the track, at least 18px. */
|
|
45
|
+
export declare function scrollAreaThumbSize(sizes: ScrollAreaSizes): number;
|
|
46
|
+
/** Radix's `getScrollPositionFromPointer`. */
|
|
47
|
+
export declare function scrollAreaScrollFromPointer(pointer: number, pointerOffset: number, sizes: ScrollAreaSizes, dir?: ScrollAreaDir): number;
|
|
48
|
+
/** Radix's `getThumbOffsetFromScroll`. */
|
|
49
|
+
export declare function scrollAreaThumbOffset(scroll: number, sizes: ScrollAreaSizes, dir?: ScrollAreaDir): number;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export declare const SELECT_CLASSES: {
|
|
2
|
+
readonly trigger: "flex w-fit items-center justify-between gap-2 rounded-lg border border-glass-stroke-card bg-glass-card px-3 py-2 text-sm whitespace-nowrap shadow-none transition-[color,border-color] duration-fast outline-none hover:bg-glass-active/50 focus-visible:border-glass-stroke-active focus-visible:ring-0 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[placeholder]:text-foreground/50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-(--menu-icon-size) [&_svg:not([class*='text-'])]:text-muted-foreground";
|
|
3
|
+
readonly triggerIcon: "size-4 opacity-50";
|
|
4
|
+
readonly content: "z-50 rounded-lg border border-glass-stroke-card bg-glass-card-opaque text-popover-foreground motion-popover relative max-h-(--radix-select-content-available-height) min-w-(--menu-min-width) max-w-(--menu-max-width) origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto";
|
|
5
|
+
/** `position="popper"` only. */
|
|
6
|
+
readonly contentPopper: "data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1";
|
|
7
|
+
readonly viewport: "p-(--menu-surface-padding)";
|
|
8
|
+
/** `position="popper"` only. */
|
|
9
|
+
readonly viewportPopper: "h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)] scroll-my-1";
|
|
10
|
+
readonly label: "px-(--menu-item-padding-x) py-1.5 text-xs text-muted-foreground";
|
|
11
|
+
readonly item: "relative flex min-h-(--menu-item-height) w-full cursor-pointer items-center gap-(--menu-item-gap) rounded-sm py-1 pr-8 pl-(--menu-item-padding-x) text-sm text-foreground/90 outline-hidden select-none focus:bg-glass-active focus:text-foreground data-[disabled]:cursor-default data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-(--menu-icon-size) [&_svg:not([class*='text-'])]:text-muted-foreground *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2";
|
|
12
|
+
readonly itemIndicator: "absolute right-2 flex size-3.5 items-center justify-center";
|
|
13
|
+
readonly itemCheck: "size-4";
|
|
14
|
+
readonly separator: "pointer-events-none -mx-1 my-1 h-px bg-glass-stroke";
|
|
15
|
+
readonly scrollButton: "flex cursor-default items-center justify-center py-1";
|
|
16
|
+
readonly scrollIcon: "size-4";
|
|
17
|
+
};
|
|
18
|
+
export declare const SELECT_INLINE: {
|
|
19
|
+
readonly value: {
|
|
20
|
+
readonly "pointer-events": "none";
|
|
21
|
+
};
|
|
22
|
+
/** The item-aligned position's fixed wrapper (before `position()` runs). */
|
|
23
|
+
readonly wrapper: {
|
|
24
|
+
readonly display: "flex";
|
|
25
|
+
readonly "flex-direction": "column";
|
|
26
|
+
readonly position: "fixed";
|
|
27
|
+
};
|
|
28
|
+
readonly viewport: {
|
|
29
|
+
readonly position: "relative";
|
|
30
|
+
readonly flex: "1";
|
|
31
|
+
readonly overflow: "hidden auto";
|
|
32
|
+
};
|
|
33
|
+
readonly scrollButton: {
|
|
34
|
+
readonly "flex-shrink": "0";
|
|
35
|
+
};
|
|
36
|
+
/** The wrapper's `justify-content` once an expand-on-scroll pinned it to the bottom. */
|
|
37
|
+
readonly expandEnd: "flex-end";
|
|
38
|
+
};
|
|
39
|
+
export declare const SELECT_VIEWPORT_ATTR = "data-radix-select-viewport";
|
|
40
|
+
/** Radix Select's viewport sheet (the native scrollbar hidden). */
|
|
41
|
+
export declare const SELECT_VIEWPORT_CSS = "[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}";
|
|
42
|
+
/** The content's style, `item-aligned`: box sizing + max height, the
|
|
43
|
+
* dismissable layer's pointer events, the flex column, no outline. */
|
|
44
|
+
export declare function selectItemAlignedContentStyle(pointerEvents: string | undefined): Record<string, string | undefined>;
|
|
45
|
+
/** The content's style, `popper`: Radix's PopperContent order (its
|
|
46
|
+
* `--radix-select-*` aliases, `animation: none` until placed). */
|
|
47
|
+
export declare function selectPopperContentStyle(pointerEvents: string | undefined, positioned: boolean): Record<string, string | undefined>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type SheetSide = `top` | `right` | `bottom` | `left`;
|
|
2
|
+
export declare const SHEET_CLASSES: {
|
|
3
|
+
readonly overlay: "fixed inset-0 z-50 bg-black/60 backdrop-blur-sm data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:duration-standard data-[state=closed]:ease-accelerate data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:duration-slow data-[state=open]:ease-decelerate";
|
|
4
|
+
readonly content: "group/sheet fixed z-50 flex flex-col gap-4 border-glass-stroke-card shadow-lg motion-sheet";
|
|
5
|
+
readonly sides: {
|
|
6
|
+
right: string;
|
|
7
|
+
left: string;
|
|
8
|
+
top: string;
|
|
9
|
+
bottom: string;
|
|
10
|
+
};
|
|
11
|
+
/** The hidden Close a drag-to-dismiss clicks. */
|
|
12
|
+
readonly dragClose: "hidden";
|
|
13
|
+
readonly close: "absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-secondary";
|
|
14
|
+
readonly closeIcon: "size-4";
|
|
15
|
+
readonly srOnly: "sr-only";
|
|
16
|
+
readonly header: "flex flex-col gap-1.5 p-4 text-left";
|
|
17
|
+
readonly footer: "mt-auto flex flex-col gap-2 p-4";
|
|
18
|
+
readonly title: "font-semibold text-foreground max-sm:group-data-[side=bottom]/sheet:text-lg max-sm:group-data-[side=bottom]/sheet:leading-none";
|
|
19
|
+
readonly description: "text-sm text-muted-foreground";
|
|
20
|
+
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const SWITCH_CLASSES: {
|
|
2
|
+
readonly root: "peer group/switch inline-flex shrink-0 items-center rounded-full border border-transparent shadow-none transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-5 data-[size=default]:w-9 data-[size=sm]:h-3.5 data-[size=sm]:w-6 data-[state=checked]:bg-primary data-[state=unchecked]:bg-glass-active";
|
|
3
|
+
readonly thumb: "pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0 group-data-[size=default]/switch:data-[state=checked]:translate-x-[calc(100%+2px)] dark:data-[state=checked]:bg-primary-foreground dark:data-[state=unchecked]:bg-foreground";
|
|
4
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const TABLE_CLASSES: {
|
|
2
|
+
readonly container: "relative w-full overflow-x-auto";
|
|
3
|
+
readonly root: "w-full caption-bottom border-collapse text-sm";
|
|
4
|
+
readonly header: "[&_tr]:hover:bg-transparent";
|
|
5
|
+
readonly body: "[&_tr:last-child]:border-0";
|
|
6
|
+
readonly footer: "border-t border-border font-medium [&>tr]:last:border-b-0";
|
|
7
|
+
readonly row: "border-b border-border transition-colors duration-fast hover:bg-glass-row data-[state=selected]:bg-glass-active";
|
|
8
|
+
readonly head: "px-3 py-2 text-left align-middle text-xs font-medium whitespace-nowrap text-muted-foreground [&:has([role=checkbox])]:pr-0";
|
|
9
|
+
readonly cell: "px-3 py-2 align-middle text-sm whitespace-nowrap [&:has([role=checkbox])]:pr-0";
|
|
10
|
+
readonly caption: "mt-4 text-sm text-muted-foreground";
|
|
11
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare const SEGMENTED_LIST = "inline-flex h-9 w-fit items-center justify-center rounded-full border border-glass-stroke-section bg-glass-section p-[3px] text-muted-foreground";
|
|
2
|
+
export declare const SEGMENTED_ROW = "flex shrink-0 items-center justify-between gap-2 px-4 pt-3 pb-2 md:px-6";
|
|
3
|
+
export declare const SEGMENTED_ROW_COMPACT = "flex shrink-0 items-center justify-between gap-2 px-2 pt-2 pb-2";
|
|
4
|
+
/** The ONE trigger sizing both strips use — no per-surface `h-8`/`text-xs`
|
|
5
|
+
* overrides, or the two drift by a pixel again. */
|
|
6
|
+
export declare const SEGMENTED_TAB = "px-3";
|
|
7
|
+
export declare const SEGMENTED_ITEM = "inline-flex shrink-0 items-center justify-center gap-1.5 rounded-full border border-transparent px-3 py-1 text-sm font-medium whitespace-nowrap transition-colors focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4";
|
|
8
|
+
export declare const TABS_CLASSES: {
|
|
9
|
+
readonly root: "flex flex-col gap-2";
|
|
10
|
+
readonly list: "inline-flex h-9 w-fit items-center justify-center rounded-full border border-glass-stroke-section bg-glass-section p-[3px] text-muted-foreground";
|
|
11
|
+
readonly trigger: "inline-flex shrink-0 items-center justify-center gap-1.5 rounded-full border border-transparent px-3 py-1 text-sm font-medium whitespace-nowrap transition-colors focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 h-[calc(100%-1px)] flex-1 text-foreground dark:text-muted-foreground dark:data-[state=active]:border-glass-stroke-active dark:data-[state=active]:bg-glass-active dark:data-[state=active]:text-foreground disabled:pointer-events-none disabled:opacity-50";
|
|
12
|
+
readonly content: "flex-1 outline-none";
|
|
13
|
+
};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare const TEXTAREA_CLASSES: {
|
|
2
|
+
readonly root: "flex field-sizing-content min-h-16 w-full resize-y [@supports(field-sizing:content)]:resize-none rounded-lg border border-glass-stroke-card bg-glass-card px-3 py-2 text-base shadow-none transition-[color,border-color] duration-fast outline-none placeholder:text-foreground/50 focus-visible:border-glass-stroke-active focus-visible:ring-0 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 md:text-sm dark:aria-invalid:ring-destructive/40";
|
|
3
|
+
};
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
export declare const TOAST_CONSTANTS: {
|
|
2
|
+
width: number;
|
|
3
|
+
gap: number;
|
|
4
|
+
peek: number;
|
|
5
|
+
scaleStep: number;
|
|
6
|
+
visible: number;
|
|
7
|
+
durationMs: number;
|
|
8
|
+
swipeThreshold: number;
|
|
9
|
+
viewportOffset: number;
|
|
10
|
+
mobileViewportOffset: number;
|
|
11
|
+
placement: {
|
|
12
|
+
pointer: string;
|
|
13
|
+
touch: string;
|
|
14
|
+
};
|
|
15
|
+
touchMaxWidth: number;
|
|
16
|
+
kinds: string[];
|
|
17
|
+
};
|
|
18
|
+
export type ToastKind = `success` | `error` | `info` | `warning`;
|
|
19
|
+
export type ToastPlacement = `bottom-right` | `top-center`;
|
|
20
|
+
export declare const TOAST_KINDS: readonly ToastKind[];
|
|
21
|
+
/** Touch = up to and including `touchMaxWidth` (the fixture's phone breakpoint). */
|
|
22
|
+
export declare const TOAST_TOUCH_QUERY: string;
|
|
23
|
+
export declare const TOAST_CLASSES: {
|
|
24
|
+
/** The fixed region (`<section>`), per placement: `viewportOffset` from
|
|
25
|
+
* the corner on a pointer, `mobileViewportOffset` below the status bar
|
|
26
|
+
* on touch. */
|
|
27
|
+
readonly region: "pointer-events-none fixed z-[100] flex";
|
|
28
|
+
readonly regionPlacement: {
|
|
29
|
+
"bottom-right": string;
|
|
30
|
+
"top-center": string;
|
|
31
|
+
};
|
|
32
|
+
/** The stack box (`<ol>`): `width` wide, its height = the geometry's. */
|
|
33
|
+
readonly list: "pointer-events-auto relative m-0 w-[356px] max-w-full list-none p-0 transition-[height] duration-standard ease-standard";
|
|
34
|
+
readonly listPlacement: {
|
|
35
|
+
"bottom-right": string;
|
|
36
|
+
"top-center": string;
|
|
37
|
+
};
|
|
38
|
+
/** The card: the opaque glass card at radius lg, no shadow; placed by its
|
|
39
|
+
* `--offset`/`--scale`. A collapsed back toast hides its contents behind
|
|
40
|
+
* the front one; a toast past `visible` draws nothing. */
|
|
41
|
+
readonly toast: "absolute inset-x-0 top-(--offset) flex items-start gap-3 rounded-lg border border-glass-stroke-card bg-glass-card-opaque p-4 font-sans text-sm text-foreground scale-(--scale) transition-[top,scale,opacity] duration-standard ease-standard data-[expanded=false]:data-[front=false]:*:opacity-0 data-[visible=false]:pointer-events-none data-[visible=false]:opacity-0";
|
|
42
|
+
/** A back card shrinks about the edge that PEEKS OUT: the top on a bottom
|
|
43
|
+
* stack, the bottom on a top stack. */
|
|
44
|
+
readonly toastOrigin: {
|
|
45
|
+
readonly bottom: "origin-top";
|
|
46
|
+
readonly top: "origin-bottom";
|
|
47
|
+
};
|
|
48
|
+
readonly content: "flex min-w-0 flex-1 flex-col gap-0.5";
|
|
49
|
+
readonly title: "leading-5 font-medium text-foreground";
|
|
50
|
+
readonly description: "leading-5 text-muted-foreground";
|
|
51
|
+
readonly action: "inline-flex h-6 shrink-0 cursor-pointer items-center rounded-md border-0 bg-primary px-2 text-xs font-medium text-primary-foreground transition-colors hover:bg-primary/90";
|
|
52
|
+
/** The close glyph: last in the row. */
|
|
53
|
+
readonly close: "order-last inline-flex size-5 shrink-0 cursor-pointer items-center justify-center rounded-sm border-0 bg-transparent p-0 text-muted-foreground transition-colors hover:text-foreground [&_svg]:size-3.5";
|
|
54
|
+
readonly iconSlot: "flex h-5 shrink-0 items-center";
|
|
55
|
+
readonly icon: "size-4 shrink-0";
|
|
56
|
+
/** The ONLY place a toast wears its kind. */
|
|
57
|
+
readonly kindIcon: {
|
|
58
|
+
success: string;
|
|
59
|
+
error: string;
|
|
60
|
+
info: string;
|
|
61
|
+
warning: string;
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
/** The Lucide glyph each kind paints (the app's concept icons
|
|
65
|
+
* `ui-success`/`ui-error`/`ui-info`/`ui-warning`, packages/icons/icons.json). */
|
|
66
|
+
export declare const TOAST_KIND_GLYPH: {
|
|
67
|
+
readonly success: "circle-check";
|
|
68
|
+
readonly error: "circle-x";
|
|
69
|
+
readonly info: "info";
|
|
70
|
+
readonly warning: "triangle-alert";
|
|
71
|
+
};
|
|
72
|
+
/** The fixture's `placement`: bottom-right on a pointer, top-centre on touch;
|
|
73
|
+
* a bottom stack measures its peek above the front toast. */
|
|
74
|
+
export declare function toastPlacement(isTouch: boolean): {
|
|
75
|
+
placement: ToastPlacement;
|
|
76
|
+
anchoredBottom: boolean;
|
|
77
|
+
};
|
|
78
|
+
export interface ToastStackItem {
|
|
79
|
+
/** The item's top inside the stack box. */
|
|
80
|
+
offset: number;
|
|
81
|
+
/** Its width factor. */
|
|
82
|
+
scale: number;
|
|
83
|
+
/** Whether it draws at all. */
|
|
84
|
+
visible: boolean;
|
|
85
|
+
}
|
|
86
|
+
/** The numbers a stack is drawn from (the toast's, the Dock pile's). */
|
|
87
|
+
export interface StackConstants {
|
|
88
|
+
/** How far an older item peeks out behind the one in front of it. */
|
|
89
|
+
peek: number;
|
|
90
|
+
/** How much smaller each rank behind the front draws. */
|
|
91
|
+
scaleStep: number;
|
|
92
|
+
/** How many items draw at all while collapsed. */
|
|
93
|
+
visible: number;
|
|
94
|
+
/** The space between items while expanded. */
|
|
95
|
+
gap: number;
|
|
96
|
+
}
|
|
97
|
+
/** THE stack geometry ×4 (fixtures/toast-stack.json `geometry`; N-12: the
|
|
98
|
+
* Dock pile draws it too): `heights` oldest first (the newest is in front).
|
|
99
|
+
* Collapsed, the item of rank r (0 = front) sits r × `peek` from the
|
|
100
|
+
* anchoring edge, shrunk by `scaleStep` per rank (clamped at the last
|
|
101
|
+
* visible rank), `visible` of them drawn; expanded, every item at full
|
|
102
|
+
* size, `gap` apart. */
|
|
103
|
+
export declare function stackGeometry(heights: readonly number[], expanded: boolean, anchoredBottom: boolean, constants: StackConstants): {
|
|
104
|
+
height: number;
|
|
105
|
+
items: ToastStackItem[];
|
|
106
|
+
};
|
|
107
|
+
/** The toast's stack (`stackGeometry` with the toast's numbers). */
|
|
108
|
+
export declare function toastStackGeometry(heights: readonly number[], expanded: boolean, anchoredBottom: boolean): {
|
|
109
|
+
height: number;
|
|
110
|
+
items: ToastStackItem[];
|
|
111
|
+
};
|
|
112
|
+
export interface ToastAction {
|
|
113
|
+
label: string;
|
|
114
|
+
onClick?: (event: Event) => void;
|
|
115
|
+
}
|
|
116
|
+
export interface ToastOptions {
|
|
117
|
+
/** A fixed id (else the store generates `toast-<n>`); re-using a live id
|
|
118
|
+
* replaces that toast. */
|
|
119
|
+
id?: string;
|
|
120
|
+
kind?: ToastKind;
|
|
121
|
+
description?: string;
|
|
122
|
+
action?: ToastAction;
|
|
123
|
+
/** The auto-dismiss clock in ms (default `durationMs`); `Infinity` = sticky. */
|
|
124
|
+
duration?: number;
|
|
125
|
+
/** A fixed height for the stack geometry (else the renderer measures). */
|
|
126
|
+
height?: number;
|
|
127
|
+
onDismiss?: (toast: ToastRecord) => void;
|
|
128
|
+
}
|
|
129
|
+
export interface ToastRecord {
|
|
130
|
+
id: string;
|
|
131
|
+
kind?: ToastKind;
|
|
132
|
+
title: string;
|
|
133
|
+
description?: string;
|
|
134
|
+
action?: ToastAction;
|
|
135
|
+
duration: number;
|
|
136
|
+
height?: number;
|
|
137
|
+
}
|
|
138
|
+
export interface ToastFn {
|
|
139
|
+
(title: string, options?: ToastOptions): string;
|
|
140
|
+
(options: ToastOptions & {
|
|
141
|
+
title: string;
|
|
142
|
+
}): string;
|
|
143
|
+
success: (title: string, options?: Omit<ToastOptions, `kind`>) => string;
|
|
144
|
+
error: (title: string, options?: Omit<ToastOptions, `kind`>) => string;
|
|
145
|
+
info: (title: string, options?: Omit<ToastOptions, `kind`>) => string;
|
|
146
|
+
warning: (title: string, options?: Omit<ToastOptions, `kind`>) => string;
|
|
147
|
+
}
|
|
148
|
+
export interface ToastStore {
|
|
149
|
+
toast: ToastFn;
|
|
150
|
+
/** Removes one toast, or every toast without an id. */
|
|
151
|
+
dismiss: (id?: string) => void;
|
|
152
|
+
/** The live toasts, oldest first. */
|
|
153
|
+
toasts: () => readonly ToastRecord[];
|
|
154
|
+
/** Called with the toasts on every change; returns the unsubscribe. */
|
|
155
|
+
subscribe: (listener: (toasts: readonly ToastRecord[]) => void) => () => void;
|
|
156
|
+
/** Stops every clock (the stack expanded), keeping what is left of each. */
|
|
157
|
+
pauseAll: () => void;
|
|
158
|
+
/** Restarts every clock with its remaining time. */
|
|
159
|
+
resumeAll: () => void;
|
|
160
|
+
readonly paused: boolean;
|
|
161
|
+
}
|
|
162
|
+
/** A toast store: the queue, the per-toast clocks and their pause. */
|
|
163
|
+
export declare function createToastStore(): ToastStore;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shorten `value` to at most `max` characters by replacing its middle with an
|
|
3
|
+
* ellipsis, keeping both ends visible (the tail slightly longer, since that is
|
|
4
|
+
* where the filename lives). Shorter values, and any `max` too small to hold a
|
|
5
|
+
* character on each side of the ellipsis, are returned unchanged.
|
|
6
|
+
*/
|
|
7
|
+
export declare function middleTruncate(value: string, max: number): string;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** The attribute the anchored arm stamps on its portal. It lives outside the
|
|
2
|
+
* host's subtree, so a Radix modal would take a click on it as an OUTSIDE
|
|
3
|
+
* interaction and close: dialog hosts whitelist this selector in their
|
|
4
|
+
* `onInteractOutside`, and treat a mounted one as "a menu is open" when
|
|
5
|
+
* routing Escape. */
|
|
6
|
+
export declare const TYPEAHEAD_PORTAL_SELECTOR = "[data-editor-autocomplete]";
|
|
7
|
+
/** Whether a Radix outside-interaction (its `target` is the pointed-at
|
|
8
|
+
* node) landed inside the anchored arm's portal. `DialogContent` and
|
|
9
|
+
* `SheetContent` ignore that one by default. */
|
|
10
|
+
export declare function isTypeaheadPortalInteraction(event: {
|
|
11
|
+
target: EventTarget | null;
|
|
12
|
+
}): boolean;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { VoiceWaveActivity } from "../../voice-wave.js";
|
|
2
|
+
export type { VoiceWaveActivity, VoiceWaveRingName } from "../../voice-wave.js";
|
|
3
|
+
export declare const VOICE_WAVE_SIZES: readonly ["sm", "md", "lg", "xl"];
|
|
4
|
+
export type VoiceWaveSize = (typeof VOICE_WAVE_SIZES)[number];
|
|
5
|
+
/** The box edge per size (px): the `VoiceWave/root` recipe's width. */
|
|
6
|
+
export declare const VOICE_WAVE_SIZE_PX: Readonly<Record<VoiceWaveSize, number>>;
|
|
7
|
+
/** Whether `activity` moves the waves (listening, thinking, speaking). */
|
|
8
|
+
export declare function voiceWaveAnimates(activity: VoiceWaveActivity): boolean;
|
|
9
|
+
/** Idle and muted paint quiet: muted colours, the wave at .35 opacity (an
|
|
10
|
+
* unknown activity is idle, as in the core). */
|
|
11
|
+
export declare function voiceWaveQuiet(activity: VoiceWaveActivity): boolean;
|
|
12
|
+
/** The accessible name (a11y.json `VoiceWave`): the label with the activity
|
|
13
|
+
* appended (`Voice, listening`); none without a label (decorative). */
|
|
14
|
+
export declare function voiceWaveName(label: string | undefined, activity: VoiceWaveActivity): string | undefined;
|
|
15
|
+
/** Calls `onFrame(elapsed seconds)` on every animation frame after the
|
|
16
|
+
* first (the first frame is the clock's zero, already painted); returns
|
|
17
|
+
* the stop. Without `requestAnimationFrame` (SSR) it never ticks. */
|
|
18
|
+
export declare function voiceWaveClock(onFrame: (elapsed: number) => void): () => void;
|
|
19
|
+
/** THE CHILD RULE's painter half (catalog/style.json `voiceWave`): the child
|
|
20
|
+
* is laid out centred at its own size; this measures its own (untransformed)
|
|
21
|
+
* border box and draws it scaled about its centre (= the box centre) by
|
|
22
|
+
* `scaleOf(its size)` (the core's `voiceWaveChildBox(size, child).scale`:
|
|
23
|
+
* min(1, childSize / its longer edge), 0 at `sm`). Re-measures on every
|
|
24
|
+
* resize (ResizeObserver: before the first paint); without one (SSR,
|
|
25
|
+
* jsdom) it measures once. Returns the stop. */
|
|
26
|
+
export declare function voiceWaveFitChild(el: HTMLElement, scaleOf: (child: {
|
|
27
|
+
width: number;
|
|
28
|
+
height: number;
|
|
29
|
+
}) => number): () => void;
|
|
30
|
+
export declare const VOICE_WAVE_CLASSES: {
|
|
31
|
+
readonly root: "relative inline-flex shrink-0 items-center justify-center";
|
|
32
|
+
readonly quiet: "opacity-35";
|
|
33
|
+
readonly size: {
|
|
34
|
+
sm: string;
|
|
35
|
+
md: string;
|
|
36
|
+
lg: string;
|
|
37
|
+
xl: string;
|
|
38
|
+
};
|
|
39
|
+
readonly svg: "pointer-events-none absolute inset-0 size-full overflow-visible";
|
|
40
|
+
readonly ring: {
|
|
41
|
+
outer: string;
|
|
42
|
+
mid: string;
|
|
43
|
+
inner: string;
|
|
44
|
+
};
|
|
45
|
+
readonly ringQuiet: "text-muted-foreground";
|
|
46
|
+
readonly child: "relative flex shrink-0 items-center justify-center text-foreground";
|
|
47
|
+
/** At `sm` (childSize 0): kept, painted nothing, no hit target. */
|
|
48
|
+
readonly childHidden: "invisible pointer-events-none";
|
|
49
|
+
readonly childMuted: "text-muted-foreground";
|
|
50
|
+
};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { type QrMatrix } from "@exponential_app/eui";
|
|
2
|
+
/** style.json `qrScanner` (the viewfinder geometry). */
|
|
3
|
+
export declare const QR_SCANNER: {
|
|
4
|
+
$comment: string;
|
|
5
|
+
maxWidth: number;
|
|
6
|
+
aspectRatio: number;
|
|
7
|
+
cornerLength: number;
|
|
8
|
+
cornerStroke: number;
|
|
9
|
+
feedAlpha: number;
|
|
10
|
+
scanLineHeight: number;
|
|
11
|
+
scanLineInset: number;
|
|
12
|
+
sweepMs: number;
|
|
13
|
+
hintGap: number;
|
|
14
|
+
placeholderIcon: string;
|
|
15
|
+
placeholderIconSize: number;
|
|
16
|
+
};
|
|
17
|
+
export interface QrPaint {
|
|
18
|
+
/** The core's matrix (null = the empty plate). */
|
|
19
|
+
matrix: QrMatrix | null;
|
|
20
|
+
/** The SVG viewBox edge in MODULES (n + 2 × quietZone); 0 without a matrix. */
|
|
21
|
+
modules: number;
|
|
22
|
+
/** One path of every dark module run in module units (quiet zone
|
|
23
|
+
* included), so `shape-rendering: crispEdges` snaps the edges to device
|
|
24
|
+
* pixels while the outer size stays the exact `size`. */
|
|
25
|
+
path: string;
|
|
26
|
+
/** The resolved colours after THE SWAP: the lighter fills the plate. */
|
|
27
|
+
plate: string;
|
|
28
|
+
module: string;
|
|
29
|
+
}
|
|
30
|
+
/** The QrCode paint of `value` at `level` (style.json `qrCode`): the core's
|
|
31
|
+
* `qrMatrix`, never a platform QR library; of the two recipe colours the
|
|
32
|
+
* lighter (relative luminance) is the plate, the darker the modules, so a
|
|
33
|
+
* dark theme still scans. A colour the parser cannot read keeps its role. */
|
|
34
|
+
export declare function qrPaint(value: string, level: unknown, plateColour: string, moduleColour: string): QrPaint;
|
|
35
|
+
/** THE web renderers' camera hook (the `qrScanner` host option; never
|
|
36
|
+
* catalog/host.json): the host renders its live feed into `feed` (an empty
|
|
37
|
+
* element filling the viewfinder; append a `<video>`), decodes codes of
|
|
38
|
+
* `formats` (default `["qr"]`) and calls `onValue` with every decoded
|
|
39
|
+
* string; the renderer dispatches `scanned {value}` once per distinct
|
|
40
|
+
* value. `start` returns the stop (called on unmount, on `disabled` and
|
|
41
|
+
* when the formats change); returning `false` (or throwing) = no camera
|
|
42
|
+
* (the placeholder shows). */
|
|
43
|
+
export interface QrScannerHost {
|
|
44
|
+
start(feed: HTMLElement, formats: readonly string[], onValue: (value: string) => void): (() => void) | false | void;
|
|
45
|
+
}
|
|
46
|
+
/** One reporter per mounted scanner: forwards a decoded value only when it
|
|
47
|
+
* differs from the last one reported (a code held in view reports once). */
|
|
48
|
+
export declare function qrScanReporter(report: (value: string) => void): (value: string) => void;
|
|
49
|
+
export declare const QR_CORNERS: readonly ["tl", "tr", "bl", "br"];
|
|
50
|
+
export type QrCorner = (typeof QR_CORNERS)[number];
|
|
51
|
+
/** One corner bracket as an SVG path in its own cornerLength-px square
|
|
52
|
+
* (placed flush in that corner of the viewfinder): two strokes of
|
|
53
|
+
* cornerStroke px whose outer edge follows the viewfinder radius `radius`
|
|
54
|
+
* (the stroke's centre line runs half a stroke inside). Draw it with
|
|
55
|
+
* round caps and `overflow: visible`. */
|
|
56
|
+
export declare function qrCornerPath(corner: QrCorner, radius: number): string;
|
|
57
|
+
/** The empty viewfinder's fill: the `feed` recipe colour at feedAlpha. */
|
|
58
|
+
export declare function qrFeedColour(colour: string): string;
|
|
59
|
+
/** The formats a scanner asks the host for (style: the catalog default). */
|
|
60
|
+
export declare function qrScanFormats(raw: unknown): string[];
|
|
61
|
+
/** A `bar` item's badge text: the number, `99+` above 99; null (no badge)
|
|
62
|
+
* at 0, unset or not a number. */
|
|
63
|
+
export declare function segmentedBadge(raw: unknown): string | null;
|
|
64
|
+
/** THE slop: how far (px) a held pointer may wander outside the box. */
|
|
65
|
+
export declare const HOLD_SLOP = 24;
|
|
66
|
+
export type HoldEvent = `holdStart` | `holdEnd` | `holdCancel`;
|
|
67
|
+
export interface HoldRect {
|
|
68
|
+
left: number;
|
|
69
|
+
top: number;
|
|
70
|
+
right: number;
|
|
71
|
+
bottom: number;
|
|
72
|
+
}
|
|
73
|
+
/** Whether (x, y) lies within the box grown by the slop on every side. */
|
|
74
|
+
export declare function withinSlop(rect: HoldRect, x: number, y: number, slop?: number): boolean;
|
|
75
|
+
/** THE hold machine of a `hold: true` Button, framework-free. The painter
|
|
76
|
+
* forwards its DOM events; `fire` gets the catalog event, `pressed` the
|
|
77
|
+
* painted state. A press never fires `press` here (the painter skips its
|
|
78
|
+
* click while `hold`). */
|
|
79
|
+
export declare class ButtonHold {
|
|
80
|
+
private readonly fire;
|
|
81
|
+
private readonly pressed;
|
|
82
|
+
private readonly disabled;
|
|
83
|
+
/** `pointer`, the key that started the hold, or null when idle. */
|
|
84
|
+
private by;
|
|
85
|
+
private pointerId;
|
|
86
|
+
constructor(fire: (event: HoldEvent) => void, pressed: (pressed: boolean) => void, disabled: () => boolean);
|
|
87
|
+
get active(): boolean;
|
|
88
|
+
private start;
|
|
89
|
+
private finish;
|
|
90
|
+
/** Pointer down (primary button): starts the hold; true = claim the
|
|
91
|
+
* pointer (capture it, prevent the long-press / scroll defaults). */
|
|
92
|
+
pointerDown(pointerId?: number | null): boolean;
|
|
93
|
+
/** A move of the holding pointer: past the slop = the slide away. */
|
|
94
|
+
pointerMove(rect: HoldRect, x: number, y: number, pointerId?: number | null): void;
|
|
95
|
+
/** The holding pointer released: within the slop ends, past it cancels. */
|
|
96
|
+
pointerUp(rect: HoldRect, x: number, y: number, pointerId?: number | null): void;
|
|
97
|
+
pointerCancel(pointerId?: number | null): void;
|
|
98
|
+
/** Key down: Space/Enter start (repeat ignored), Escape cancels. True =
|
|
99
|
+
* the key was handled (prevent its default: no click, no scroll). */
|
|
100
|
+
keyDown(key: string, repeat?: boolean): boolean;
|
|
101
|
+
/** Key up of the key that started the hold ends it. */
|
|
102
|
+
keyUp(key: string): boolean;
|
|
103
|
+
blur(): void;
|
|
104
|
+
/** Unmount or `disabled` mid-hold: drop it silently. */
|
|
105
|
+
reset(): void;
|
|
106
|
+
private samePointer;
|
|
107
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** `next` with every part deep-equal to `prev`'s replaced by `prev`'s
|
|
2
|
+
* object (arrays of nodes matched by `id`, other arrays by index): a
|
|
3
|
+
* re-reduce (`updateComponents`) hands every unchanged node its old
|
|
4
|
+
* object, so the renderers skip it. Plain JSON only; anything else is
|
|
5
|
+
* taken as it is. */
|
|
6
|
+
export declare function share<T>(prev: unknown, next: T): T;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export interface TableColumn {
|
|
2
|
+
key: string;
|
|
3
|
+
/** The header text (a slot or checkbox column may have none). */
|
|
4
|
+
label?: string;
|
|
5
|
+
type?: `text` | `number` | `date` | `boolean` | `badge` | `slot` | `currency` | `percent` | `relativeTime`;
|
|
6
|
+
slot?: string;
|
|
7
|
+
/** ISO 4217 code of a `currency` column. */
|
|
8
|
+
currency?: string;
|
|
9
|
+
/** Fixed fraction digits of a number / currency / percent column. */
|
|
10
|
+
decimals?: number;
|
|
11
|
+
width?: number;
|
|
12
|
+
align?: `start` | `center` | `end`;
|
|
13
|
+
sortable?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface TableSort {
|
|
16
|
+
key: string;
|
|
17
|
+
direction: `asc` | `desc`;
|
|
18
|
+
}
|
|
19
|
+
/** The renderer's local order of `rows` for a sort (unbound sort). */
|
|
20
|
+
export declare function sortRows(rows: readonly Record<string, unknown>[], sort: TableSort | null, column: TableColumn | undefined, locale: string): number[];
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { FontSpec, RecipeRule, ResolvedTheme } from "@exponential_app/eui";
|
|
2
|
+
export declare const LAYERS = "@layer xui-base, xui-recipe, xui-node, xui-part, xui-author;";
|
|
3
|
+
/** `$color.primary` → `--xui-color-primary`; `$type.lineHeight.sm` →
|
|
4
|
+
* `--xui-type-lineHeight-sm` (the group path verbatim); `$type.family.sans`
|
|
5
|
+
* → `--xui-font-sans`. */
|
|
6
|
+
export declare function tokenVarName(ref: string): string | null;
|
|
7
|
+
export declare function tokenVar(ref: string): string | null;
|
|
8
|
+
/** One style value → its CSS text; `null` = nothing to emit. */
|
|
9
|
+
export declare function cssValue(key: string, value: unknown, fonts?: Record<string, FontSpec>): string | null;
|
|
10
|
+
/** Flat declarations (`prop:value` pairs) for one condition-free style. A
|
|
11
|
+
* border width without a `borderStyle` is solid (contract §2). An
|
|
12
|
+
* animation that moves opacity MULTIPLIES the node's own (round 2 §2): the
|
|
13
|
+
* keyframes move `--xui-a-opacity` and `opacity` = own ×
|
|
14
|
+
* `var(--xui-a-opacity, 1)`. `base` = the style a condition block cascades
|
|
15
|
+
* over, so a block that adds only the animation (or only the opacity)
|
|
16
|
+
* still multiplies the other's value. */
|
|
17
|
+
export declare function declarations(style: Record<string, unknown>, fonts?: Record<string, FontSpec>, base?: Record<string, unknown>): [string, string][];
|
|
18
|
+
/** `animation: <name>` as CSS longhands over `@keyframes xui-<name>`
|
|
19
|
+
* (base-css.ts): duration = the motion token × the set's factor (an
|
|
20
|
+
* `animationDuration` token replaces the token, the factor kept), easing
|
|
21
|
+
* per segment = `animation-timing-function`, fill both. An unknown name =
|
|
22
|
+
* no animation. Reduced motion zeroes the duration (base-css.ts), which
|
|
23
|
+
* shows each set's rest frame. */
|
|
24
|
+
export declare function animationDeclarations(name: unknown, durationToken?: unknown): [string, string][];
|
|
25
|
+
/** The shimmer BAND of `animation: shimmer` (style.json `animations.shimmer`
|
|
26
|
+
* `band`): an `::after` over the box, a gradient of the band colour at
|
|
27
|
+
* alpha 0 → .5 → 0, one box wide, at `--xui-band` box widths (the
|
|
28
|
+
* keyframes move it −1 → 1), clipped to the box. Empty for anything else. */
|
|
29
|
+
export declare function shimmerRule(selector: string, style: Record<string, unknown>): string;
|
|
30
|
+
export declare const rule: (selector: string, decls: [string, string][]) => string;
|
|
31
|
+
/** Every way an element can be in a state: the pseudo-class or the attribute
|
|
32
|
+
* Radix sets, plus the forced marker the recipe sheet writes. */
|
|
33
|
+
export declare const STATE_SELECTORS: Record<string, string[]>;
|
|
34
|
+
/** A native's recipe props ride as `data-r-<prop>`, a macro part's as
|
|
35
|
+
* `data-m-<prop>`: a Badge's label is a Text, and both key on `variant`. */
|
|
36
|
+
export declare const propAttribute: (macro: boolean, prop: string) => string;
|
|
37
|
+
/** The selectors one recipe rule applies to, for the part's class. */
|
|
38
|
+
export declare function ruleSelectors(base: string, rule: RecipeRule, macro?: boolean): string[];
|
|
39
|
+
export interface CompiledTheme {
|
|
40
|
+
/** The class on the surface root AND on every element it paints. */
|
|
41
|
+
scope: string;
|
|
42
|
+
/** The whole sheet: layer order, variables (both modes), recipes. */
|
|
43
|
+
css: string;
|
|
44
|
+
theme: ResolvedTheme;
|
|
45
|
+
}
|
|
46
|
+
export declare function themeScope(theme: ResolvedTheme): string;
|
|
47
|
+
/** Whether a component's parts go in the `xui-part` layer (macro parts win
|
|
48
|
+
* over an author's style) or the `xui-recipe` layer (a native's own look
|
|
49
|
+
* yields to it). Extension macros are listed by the caller. */
|
|
50
|
+
export declare function isMacroComponent(component: string, extensionMacros?: ReadonlySet<string>): boolean;
|
|
51
|
+
export declare const partClass: (component: string, part: string) => string;
|
|
52
|
+
export declare function compileTheme(theme: ResolvedTheme, options?: {
|
|
53
|
+
extensionMacros?: ReadonlySet<string>;
|
|
54
|
+
}): CompiledTheme;
|
|
55
|
+
/** `compileTheme`, memoized per resolved theme object (the common case:
|
|
56
|
+
* a built-in or a theme the host loaded once). */
|
|
57
|
+
export declare function compiledTheme(theme: ResolvedTheme, options?: {
|
|
58
|
+
extensionMacros?: ReadonlySet<string>;
|
|
59
|
+
}): CompiledTheme;
|
|
60
|
+
/** FEED-128: the theme as an app's UNSCOPED shadcn globals: the shadcn /
|
|
61
|
+
* Tailwind variable names (the same `SHADCN_ALIASES` the surface sheet
|
|
62
|
+
* maps) with LITERAL values (hex colours, px radius, font stacks; never a
|
|
63
|
+
* `var(--xui-*)`), light under `:root` and dark under `.dark` by default.
|
|
64
|
+
* A non-Exponential-UI app (shadcn-solid, plain Tailwind) pastes it as its
|
|
65
|
+
* globals.css and wears the theme. */
|
|
66
|
+
export declare function globalsCss(theme: ResolvedTheme, options?: {
|
|
67
|
+
light?: string;
|
|
68
|
+
dark?: string;
|
|
69
|
+
}): string;
|