@exponential_app/eui 0.2.1 → 0.3.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.
Files changed (66) hide show
  1. package/catalog/a11y.json +15 -1
  2. package/catalog/core.catalog.json +142 -0
  3. package/catalog/core.schema.json +198 -1
  4. package/catalog/host.json +10 -0
  5. package/catalog/macros.json +541 -1
  6. package/catalog/recipes.json +2 -2
  7. package/catalog/strings.json +5 -0
  8. package/catalog/theme.schema.json +2066 -212
  9. package/conformance/manifest.json +5 -5
  10. package/dist/chunks/{index-gtk2gwsb.js → index-4z7f2bp1.js} +160 -33
  11. package/dist/chunks/{index-gtk2gwsb.js.map → index-4z7f2bp1.js.map} +6 -5
  12. package/dist/chunks/{index-5fmaa0xq.js → index-abcjanhc.js} +629 -3
  13. package/dist/chunks/{index-5fmaa0xq.js.map → index-abcjanhc.js.map} +2 -2
  14. package/dist/chunks/{index-62yzr94z.js → index-dx45asrf.js} +99 -3
  15. package/dist/chunks/{index-62yzr94z.js.map → index-dx45asrf.js.map} +2 -2
  16. package/dist/chunks/{index-bg2jsgjq.js → index-h3zgfghf.js} +304 -6
  17. package/dist/chunks/{index-bg2jsgjq.js.map → index-h3zgfghf.js.map} +2 -2
  18. package/dist/conformance.js +7901 -614
  19. package/dist/conformance.js.map +2 -2
  20. package/dist/entries/prompt.js +2 -2
  21. package/dist/entries/schema.js +2 -2
  22. package/dist/host/index.js +20 -4
  23. package/dist/host/index.js.map +1 -1
  24. package/dist/index.js +35 -5
  25. package/dist/index.js.map +2 -2
  26. package/dist/types/src/catalog.generated.d.ts +23 -3
  27. package/dist/types/src/host/contract.d.ts +17 -0
  28. package/dist/types/src/host/exposes.d.ts +68 -0
  29. package/dist/types/src/host/index.d.ts +1 -0
  30. package/dist/types/src/host/package.d.ts +8 -0
  31. package/dist/types/src/web/primitives/carousel.d.ts +17 -0
  32. package/dist/types/src/web/primitives/index.d.ts +3 -0
  33. package/dist/types/src/web/primitives/mosaic.d.ts +30 -0
  34. package/dist/types/src/web/primitives/outline.d.ts +22 -0
  35. package/dist/web/index.js +8 -2
  36. package/dist/web/index.js.map +4 -4
  37. package/dist/web/primitives/index.js +59 -1
  38. package/dist/web/primitives/index.js.map +6 -3
  39. package/docs/components.generated.json +150 -1
  40. package/docs/package-format.md +56 -1
  41. package/docs/round-6-contract.md +108 -0
  42. package/docs/themes.generated.json +39 -2
  43. package/fixtures/bind-time.json +1464 -0
  44. package/fixtures/catalog-components.json +96 -0
  45. package/fixtures/catalog-macros.json +1159 -48
  46. package/fixtures/conformance-baseline.json +46073 -44448
  47. package/fixtures/conformance-known.json +76 -64
  48. package/fixtures/host-router.json +539 -1
  49. package/fixtures/kitchen-sink.expanded.json +614 -1
  50. package/fixtures/kitchen-sink.json +69 -1
  51. package/fixtures/primitive-specimens.json +3 -0
  52. package/fixtures/prompt-budget.json +14 -14
  53. package/fixtures/specimens.json +122 -0
  54. package/fixtures/theme-recipes.json +4617 -1691
  55. package/fixtures/theme-resolved.json +1154 -2
  56. package/generated/ExponentialUICatalog.generated.kt +13 -13
  57. package/generated/ExponentialUICatalog.generated.swift +13 -13
  58. package/generated/ExponentialUIThemes.generated.kt +7 -7
  59. package/generated/ExponentialUIThemes.generated.swift +7 -7
  60. package/generated/catalog.descriptions.generated.rs +1 -1
  61. package/generated/catalog.generated.rs +18 -18
  62. package/generated/catalog.themes.generated.rs +8 -8
  63. package/generated/core.descriptions.json +96 -0
  64. package/generated/core.runtime.json +86 -0
  65. package/package.json +1 -1
  66. package/themes/neutral.theme.json +288 -0
@@ -7,12 +7,12 @@ export declare const BASIC_VERSION = "v0.9";
7
7
  export declare const CATALOG_VERSION = "1";
8
8
  export declare const UNKNOWN_COMPONENT_NAME = "Unknown";
9
9
  /** Every component in source order (the hidden placeholder included). */
10
- export declare const COMPONENT_NAMES: readonly ["Box", "Stack", "Grid", "Card", "Separator", "List", "Resizable", "ScrollArea", "Sidebar", "SplitView", "AppBar", "Page", "Toolbar", "Section", "Group", "Text", "Heading", "Markdown", "CodeBlock", "Kbd", "Label", "Image", "Icon", "Video", "AudioPlayer", "Avatar", "QrCode", "Carousel", "Tabs", "Segmented", "Accordion", "Collapsible", "Trace", "TraceItem", "Plan", "Pagination", "Breadcrumb", "Stepper", "Dialog", "Drawer", "DockCard", "AlertDialog", "Popover", "Tooltip", "Menu", "Toast", "Badge", "Alert", "Chip", "EmptyState", "Progress", "Meter", "Ring", "Spinner", "Skeleton", "VoiceWave", "CallSurface", "Table", "Chart", "Sparkline", "StatTile", "Button", "Link", "Toggle", "Form", "FieldGroup", "FormActions", "Input", "Textarea", "NumberField", "Checkbox", "Radio", "ChoiceTiles", "Switch", "Slider", "Rating", "Select", "SearchList", "ChipInput", "DatePicker", "DateRangePicker", "TimePicker", "FileUpload", "QrScanner", "Composer", "Row", "MessageBubble", "TreeGuides", "Unknown"];
10
+ export declare const COMPONENT_NAMES: readonly ["Box", "Stack", "Grid", "Card", "Separator", "List", "Resizable", "ScrollArea", "Sidebar", "SplitView", "AppBar", "Page", "Toolbar", "Section", "Group", "Text", "Heading", "Markdown", "CodeBlock", "Kbd", "Label", "Image", "Icon", "Video", "AudioPlayer", "Avatar", "QrCode", "Carousel", "Mosaic", "Tabs", "Segmented", "Accordion", "Collapsible", "Trace", "TraceItem", "Plan", "Pagination", "Breadcrumb", "Outline", "Stepper", "Dialog", "Drawer", "DockCard", "AlertDialog", "Popover", "Tooltip", "Menu", "Toast", "Badge", "Alert", "Chip", "EmptyState", "Progress", "Meter", "Ring", "Spinner", "Skeleton", "VoiceWave", "CallSurface", "Table", "Chart", "Sparkline", "StatTile", "Button", "Link", "Toggle", "Form", "FieldGroup", "FormActions", "Input", "Textarea", "NumberField", "Checkbox", "Radio", "ChoiceTiles", "Switch", "Slider", "Rating", "Select", "SearchList", "ChipInput", "DatePicker", "DateRangePicker", "TimePicker", "FileUpload", "QrScanner", "Composer", "Row", "MessageBubble", "TreeGuides", "Unknown"];
11
11
  export type ComponentName = (typeof COMPONENT_NAMES)[number];
12
12
  export declare const NATIVE_COMPONENTS: readonly ["Box", "List", "Resizable", "Text", "Markdown", "CodeBlock", "Image", "Icon", "Video", "AudioPlayer", "Avatar", "QrCode", "Carousel", "Tabs", "Segmented", "Accordion", "Dialog", "Drawer", "Popover", "Tooltip", "Menu", "Toast", "Ring", "Spinner", "Skeleton", "VoiceWave", "Table", "Chart", "Button", "Link", "Toggle", "Form", "Input", "Textarea", "NumberField", "Checkbox", "Radio", "ChoiceTiles", "Switch", "Slider", "Select", "SearchList", "ChipInput", "DatePicker", "DateRangePicker", "TimePicker", "FileUpload", "QrScanner", "Composer", "TreeGuides", "Unknown"];
13
- export declare const MACRO_COMPONENTS: readonly ["Stack", "Grid", "Card", "Separator", "ScrollArea", "Sidebar", "SplitView", "AppBar", "Page", "Toolbar", "Section", "Group", "Heading", "Kbd", "Label", "Collapsible", "Trace", "TraceItem", "Plan", "Pagination", "Breadcrumb", "Stepper", "DockCard", "AlertDialog", "Badge", "Alert", "Chip", "EmptyState", "Progress", "Meter", "CallSurface", "Sparkline", "StatTile", "FieldGroup", "FormActions", "Rating", "Row", "MessageBubble"];
13
+ export declare const MACRO_COMPONENTS: readonly ["Stack", "Grid", "Card", "Separator", "ScrollArea", "Sidebar", "SplitView", "AppBar", "Page", "Toolbar", "Section", "Group", "Heading", "Kbd", "Label", "Mosaic", "Collapsible", "Trace", "TraceItem", "Plan", "Pagination", "Breadcrumb", "Outline", "Stepper", "DockCard", "AlertDialog", "Badge", "Alert", "Chip", "EmptyState", "Progress", "Meter", "CallSurface", "Sparkline", "StatTile", "FieldGroup", "FormActions", "Rating", "Row", "MessageBubble"];
14
14
  /** The core-lite subset (no overlays, media or Chart). */
15
- export declare const LITE_COMPONENTS: readonly ["Box", "Stack", "Grid", "Card", "Separator", "List", "Resizable", "ScrollArea", "Sidebar", "SplitView", "AppBar", "Page", "Toolbar", "Section", "Group", "Text", "Heading", "Markdown", "CodeBlock", "Kbd", "Label", "Icon", "Avatar", "Tabs", "Segmented", "Collapsible", "Trace", "TraceItem", "Plan", "Breadcrumb", "Stepper", "Badge", "Alert", "Chip", "EmptyState", "Progress", "Meter", "Ring", "Skeleton", "StatTile", "Button", "Link", "Form", "FieldGroup", "FormActions", "Input", "Textarea", "NumberField", "Checkbox", "Switch", "Rating", "Select", "SearchList", "ChipInput", "DatePicker", "DateRangePicker", "TimePicker", "FileUpload", "Composer", "Row", "MessageBubble"];
15
+ export declare const LITE_COMPONENTS: readonly ["Box", "Stack", "Grid", "Card", "Separator", "List", "Resizable", "ScrollArea", "Sidebar", "SplitView", "AppBar", "Page", "Toolbar", "Section", "Group", "Text", "Heading", "Markdown", "CodeBlock", "Kbd", "Label", "Icon", "Avatar", "Tabs", "Segmented", "Collapsible", "Trace", "TraceItem", "Plan", "Breadcrumb", "Outline", "Stepper", "Badge", "Alert", "Chip", "EmptyState", "Progress", "Meter", "Ring", "Skeleton", "StatTile", "Button", "Link", "Form", "FieldGroup", "FormActions", "Input", "Textarea", "NumberField", "Checkbox", "Switch", "Rating", "Select", "SearchList", "ChipInput", "DatePicker", "DateRangePicker", "TimePicker", "FileUpload", "Composer", "Row", "MessageBubble"];
16
16
  export declare const COMPONENT_GROUPS: Record<ComponentName, string>;
17
17
  /** The specimen id each component has on ui.exponential.at. */
18
18
  export declare const SPECIMEN_IDS: Record<ComponentName, string>;
@@ -250,6 +250,15 @@ export interface Shapes {
250
250
  icon?: IconName;
251
251
  status?: TraceStatusValue;
252
252
  };
253
+ outlineItem: {
254
+ id: string;
255
+ title: string | Dynamic;
256
+ count?: number | Dynamic;
257
+ };
258
+ picture: {
259
+ src: string;
260
+ alt?: string;
261
+ };
253
262
  }
254
263
  /** Every component's props, by name. */
255
264
  export interface ComponentProps {
@@ -426,6 +435,12 @@ export interface ComponentProps {
426
435
  page?: number | Dynamic;
427
436
  loop?: boolean;
428
437
  indicators?: boolean;
438
+ counter?: boolean;
439
+ thumbnails?: string[];
440
+ };
441
+ Mosaic: {
442
+ pictures: Shapes["picture"][];
443
+ label?: string;
429
444
  };
430
445
  Tabs: {
431
446
  tabs: Shapes["tab"][];
@@ -482,6 +497,11 @@ export interface ComponentProps {
482
497
  Breadcrumb: {
483
498
  items: Shapes["option"][];
484
499
  };
500
+ Outline: {
501
+ items: Shapes["outlineItem"][];
502
+ value?: string | Dynamic;
503
+ caption?: string;
504
+ };
485
505
  Stepper: {
486
506
  steps: Shapes["step"][];
487
507
  current?: number | Dynamic;
@@ -84,6 +84,23 @@ export declare const HOST_CONTRACT: {
84
84
  transports: string[];
85
85
  functionPrefix: string;
86
86
  };
87
+ exposes: {
88
+ $comment: string;
89
+ limits: {
90
+ namePattern: string;
91
+ nameMax: number;
92
+ titleMax: number;
93
+ descriptionMax: number;
94
+ maxTools: number;
95
+ separator: string;
96
+ };
97
+ runKinds: string[];
98
+ recordOps: string[];
99
+ readRecordOps: string[];
100
+ readOpWords: string[];
101
+ destructiveWords: string[];
102
+ actionPattern: string;
103
+ };
87
104
  extensions: {
88
105
  $comment: string;
89
106
  versionPattern: string;
@@ -0,0 +1,68 @@
1
+ import type { PackageIssue } from "./package.js";
2
+ export declare const EXPOSES_LIMITS: {
3
+ namePattern: string;
4
+ nameMax: number;
5
+ titleMax: number;
6
+ descriptionMax: number;
7
+ maxTools: number;
8
+ separator: string;
9
+ };
10
+ export declare const EXPOSE_RUN_KINDS: readonly string[];
11
+ export type ExposeAccess = `read` | `write`;
12
+ export interface PackageExpose {
13
+ /** `^[a-z][a-z0-9_]*$`, at most `limits.nameMax`, never `__`. */
14
+ name: string;
15
+ title: string;
16
+ description: string;
17
+ /** A JSON Schema of `type: "object"`: the tool's inputSchema. */
18
+ input: {
19
+ type: `object`;
20
+ properties?: Record<string, unknown>;
21
+ required?: string[];
22
+ };
23
+ access: ExposeAccess;
24
+ /** Exactly one of `records`, `action`, `upstream`; every string may hold
25
+ * `${input.<path>}` templates. */
26
+ run: {
27
+ records: {
28
+ op: `list` | `get` | `upsert`;
29
+ kind: string;
30
+ id?: unknown;
31
+ where?: Record<string, unknown>;
32
+ data?: Record<string, unknown>;
33
+ limit?: unknown;
34
+ };
35
+ } | {
36
+ action: string;
37
+ args?: Record<string, unknown>;
38
+ } | {
39
+ upstream: string;
40
+ tool: string;
41
+ args?: Record<string, unknown>;
42
+ };
43
+ }
44
+ /** One problem with a binding: the eMCP error `code` (`fixtures/exposes.json`
45
+ * `errors`), the binding's `index` (null = the list) and the package issue. */
46
+ export interface ExposeIssue extends PackageIssue {
47
+ index: number | null;
48
+ code: string;
49
+ }
50
+ /** The input paths a run's templates name (`${input.a.b}` → `a.b`), in
51
+ * document order. */
52
+ export declare function exposeTemplatePaths(value: unknown): string[];
53
+ /** An action reads when the last word of its name is a read word
54
+ * (`exponential.issues.list`); a verb writes. */
55
+ export declare function exposeActionAccess(action: string): ExposeAccess;
56
+ /** A tool or action name holding a destructive word (delete, merge, close,
57
+ * end, remove, trash) is never exposed. */
58
+ export declare function exposeNameDestructive(name: string): boolean;
59
+ /** Every problem with a package's `upstreams`: the team MCP server names
60
+ * its upstream bindings may call. */
61
+ export declare function validateUpstreams(upstreams: unknown): PackageIssue[];
62
+ /** Every problem with a package's `exposes`, in binding order, with its
63
+ * eMCP code. `records` and `upstreams` = the package's (a binding reads
64
+ * only its own kinds and calls only its own upstreams). */
65
+ export declare function exposeIssues(exposes: unknown, records: unknown, upstreams: unknown): ExposeIssue[];
66
+ /** Every problem with a package's `exposes` (`exposeIssues` as package
67
+ * issues). */
68
+ export declare function validatePackageExposes(exposes: unknown, records: unknown, upstreams: unknown): PackageIssue[];
@@ -6,6 +6,7 @@ export * from "./package.js";
6
6
  export * from "./records.js";
7
7
  export * from "./record-store.js";
8
8
  export * from "./tools.js";
9
+ export * from "./exposes.js";
9
10
  export * from "./signature.js";
10
11
  export { HostRouter, normalizePath } from "./router.js";
11
12
  export type { HostRouterOptions, SurfaceInfo } from "./router.js";
@@ -2,6 +2,7 @@ import type { FlatComponent } from "../types.js";
2
2
  import type { ServerMessage } from "./contract.js";
3
3
  import type { RecordKind } from "./records.js";
4
4
  import type { PackageTool } from "./tools.js";
5
+ import type { PackageExpose } from "./exposes.js";
5
6
  /** VAPP-161: the package format version this host reads
6
7
  * (catalog/host.json `package.formatVersion`; docs/package-format.md).
7
8
  * A package without `formatVersion` is version 1; every version-1
@@ -56,6 +57,13 @@ export interface AppPackage {
56
57
  tools?: Record<string, PackageTool>;
57
58
  /** VAPP-161: the extension catalogs it needs beyond `catalogId`. */
58
59
  extensions?: PackageExtension[];
60
+ /** VAPP-180: the MCP tools it exposes to a host's MCP broker
61
+ * (`host/exposes.ts`): declarative bindings over its records, the host's
62
+ * actions or its upstreams, run as the calling person. */
63
+ exposes?: PackageExpose[];
64
+ /** VAPP-180: the MCP server names (the host's, e.g. a team's servers) its
65
+ * `upstream` bindings call. */
66
+ upstreams?: string[];
59
67
  }
60
68
  /** VAPP-161: an extension catalog a package needs: its id, the minimum
61
69
  * `MAJOR.MINOR.PATCH` (caret) and the components it uses from it. */
@@ -0,0 +1,17 @@
1
+ export declare const CAROUSEL_GEOMETRY: {
2
+ readonly thumbnail: 52;
3
+ readonly ring: 2;
4
+ readonly thumbnailGap: 8;
5
+ readonly counterInset: 8;
6
+ };
7
+ /** The counter's text: `i / n` (1-based). */
8
+ export declare function carouselCounterText(page: number, total: number): string;
9
+ export declare const CAROUSEL_CLASSES: {
10
+ /** The pill over the slide; its parent is `relative`. */
11
+ readonly counter: "pointer-events-none absolute start-2 top-2 z-10 rounded-full bg-black/55 px-2 text-xs leading-5 font-medium text-white tabular-nums";
12
+ /** The filmstrip: one row, scrolling sideways when it overflows. */
13
+ readonly thumbnails: "flex flex-row gap-[8px] overflow-x-auto pt-2 [scrollbar-width:none]";
14
+ /** One thumbnail: a button; the current one `data-current=true`. */
15
+ readonly thumbnail: "relative size-[52px] shrink-0 cursor-pointer overflow-hidden rounded-md border-2 border-transparent bg-muted p-0 opacity-70 outline-none transition-opacity duration-fast hover:opacity-100 focus-visible:ring-[3px] focus-visible:ring-ring/50 data-[current=true]:border-foreground data-[current=true]:opacity-100";
16
+ readonly thumbnailImage: "size-full object-cover";
17
+ };
@@ -7,6 +7,7 @@ export * from "./breadcrumb.js";
7
7
  export * from "./button.js";
8
8
  export * from "./calendar.js";
9
9
  export * from "./card.js";
10
+ export * from "./carousel.js";
10
11
  export * from "./checkbox.js";
11
12
  export * from "./choice-tiles.js";
12
13
  export * from "./cn.js";
@@ -28,6 +29,8 @@ export * from "./kbd.js";
28
29
  export * from "./label.js";
29
30
  export * from "./menu-surface.js";
30
31
  export * from "./meter.js";
32
+ export * from "./mosaic.js";
33
+ export * from "./outline.js";
31
34
  export * from "./popover.js";
32
35
  export * from "./progress-ring.js";
33
36
  export * from "./progress.js";
@@ -0,0 +1,30 @@
1
+ export declare const MOSAIC_GEOMETRY: {
2
+ readonly gap: 10;
3
+ readonly largeFraction: 0.6;
4
+ readonly aspect: 1.6;
5
+ readonly radius: 10;
6
+ };
7
+ export type MosaicTileSize = `large` | `half` | `small`;
8
+ export interface MosaicTile {
9
+ index: number;
10
+ size: MosaicTileSize;
11
+ /** The pictures past the third: "+N" over this tile (0 = none). */
12
+ more: number;
13
+ }
14
+ /** The tiles a group of `count` pictures draws. */
15
+ export declare function mosaicTiles(count: number): MosaicTile[];
16
+ export declare const MOSAIC_CLASSES: {
17
+ /** The group: `aspect` w/h, a row of the lead tile(s) and the side column. */
18
+ readonly root: "flex aspect-[1.6] w-full min-w-0 flex-row gap-[10px]";
19
+ /** The right column of the 3+ layout: the two small tiles stacked. */
20
+ readonly side: "flex min-w-0 flex-1 flex-col gap-[10px]";
21
+ /** One tile: a button holding its picture; `data-size` = the tile size. */
22
+ readonly tile: "relative min-h-0 min-w-0 cursor-pointer overflow-hidden rounded-[10px] border border-glass-stroke-card bg-muted p-0 outline-none transition-opacity duration-fast hover:opacity-90 focus-visible:ring-[3px] focus-visible:ring-ring/50";
23
+ /** A tile that shares its row or column equally (1, 2, the small two). */
24
+ readonly fill: "flex-1";
25
+ /** The large tile beside the side column: `largeFraction` of the width. */
26
+ readonly lead: "shrink-0 grow-0 basis-[60%]";
27
+ readonly image: "absolute inset-0 size-full object-cover";
28
+ /** The "+N" scrim over the last tile. */
29
+ readonly more: "pointer-events-none absolute inset-0 flex items-center justify-center bg-black/55 text-xl font-semibold text-white";
30
+ };
@@ -0,0 +1,22 @@
1
+ export declare const OUTLINE_GEOMETRY: {
2
+ readonly rowHeight: 32;
3
+ readonly activeBar: 2;
4
+ };
5
+ export interface OutlineItem {
6
+ id: string;
7
+ title: string;
8
+ /** A muted `· n` after the title; 0 or unset = none. */
9
+ count?: number | null;
10
+ }
11
+ export declare const OUTLINE_CLASSES: {
12
+ readonly root: "flex min-w-0 flex-col gap-[2px]";
13
+ readonly caption: "px-2 py-1 text-[11px] leading-4 font-medium tracking-[0.5px] text-muted-foreground uppercase";
14
+ /** One row: a button, the active one `data-active=true`. */
15
+ readonly row: "relative flex h-[32px] w-full min-w-0 cursor-pointer items-center gap-1 overflow-hidden rounded-md px-2 text-start text-sm text-muted-foreground outline-none transition-colors duration-fast hover:bg-accent focus-visible:ring-[3px] focus-visible:ring-ring/50 data-[active=true]:bg-accent data-[active=true]:font-medium data-[active=true]:text-foreground";
16
+ /** The leading-edge bar of the active row. */
17
+ readonly bar: "pointer-events-none absolute inset-y-0 start-0 w-[2px] bg-foreground";
18
+ readonly title: "min-w-0 flex-1 truncate";
19
+ readonly count: "shrink-0 text-xs text-muted-foreground tabular-nums";
20
+ };
21
+ /** The trailing count text (`· n`), or null when there is none. */
22
+ export declare function outlineCountText(count: number | null | undefined): string | null;
package/dist/web/index.js CHANGED
@@ -1133,6 +1133,12 @@ button:where([data-xui-part],.xui-calendar-nav,.xui-table-sort,.xui-carousel-nav
1133
1133
  .xui-carousel-dots{display:flex;justify-content:center;gap:var(--xui-spacing-xs);padding-top:var(--xui-spacing-sm)}
1134
1134
  .xui-Carousel-indicator{width:6px;height:6px;border-radius:9999px;background:var(--xui-color-border);padding:0;cursor:pointer}
1135
1135
  .xui-Carousel-indicator[data-xs~="selected"]{background:var(--xui-color-primary)}
1136
+ .xui-carousel-stage{position:relative;display:flex;flex-direction:column;min-width:0}
1137
+ .xui-Carousel-counter{position:absolute;top:var(--xui-spacing-sm);inset-inline-start:var(--xui-spacing-sm);z-index:1;pointer-events:none;display:inline-flex;align-items:center;white-space:nowrap;font-variant-numeric:tabular-nums}
1138
+ .xui-Carousel-thumbnails{display:flex;flex-direction:row;justify-content:flex-start;flex-shrink:0;overflow-x:auto;scrollbar-width:none}
1139
+ .xui-Carousel-thumbnails::-webkit-scrollbar{display:none}
1140
+ .xui-Carousel-thumbnail{position:relative;flex:0 0 auto;overflow:hidden;cursor:pointer;padding:0;border-style:solid}
1141
+ .xui-carousel-thumb{position:absolute;inset:0;display:block;width:100%;height:100%;object-fit:cover;pointer-events:none}
1136
1142
  [data-xui-c="Tabs"].xui-el{flex-direction:column}
1137
1143
  .xui-Tabs-list{display:flex;flex-direction:row;align-self:flex-start;flex-shrink:0}
1138
1144
  .xui-Tabs-list[data-fill="true"]{align-self:stretch}
@@ -2378,7 +2384,7 @@ var PLACED = {
2378
2384
  SearchList: [`head`, `search`, `count`, `body`, `list`, `empty`, `fade`],
2379
2385
  Menu: [`trigger`, `head`, `search`, `count`, `body`, `list`, `empty`, `fade`],
2380
2386
  Table: [`header`, `body`, `caption`, `empty`],
2381
- Carousel: [`page`, `indicator`, `controls`, `previous`, `next`],
2387
+ Carousel: [`page`, `indicator`, `controls`, `previous`, `next`, `counter`, `thumbnails`],
2382
2388
  Tooltip: [`anchor`],
2383
2389
  FileUpload: [`label`, `dropzone`, `icon`, `title`, `hint`, `browse`, `description`],
2384
2390
  CodeBlock: [`header`, `title`, `copy`, `body`],
@@ -2561,5 +2567,5 @@ export {
2561
2567
  withinSlop
2562
2568
  };
2563
2569
 
2564
- //# debugId=3DD32DA39743EA9764756E2164756E21
2570
+ //# debugId=1A8295752F81FE6764756E2164756E21
2565
2571
  //# sourceMappingURL=index.js.map