@reactzero/combo 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -0
- package/LICENSE +21 -0
- package/README.md +188 -0
- package/dist/Combo-Cx3kSkop.cjs +2 -0
- package/dist/Combo-Cx3kSkop.cjs.map +1 -0
- package/dist/Combo-qs6_L512.js +439 -0
- package/dist/Combo-qs6_L512.js.map +1 -0
- package/dist/components/Combo.d.ts +71 -0
- package/dist/components/Combo.d.ts.map +1 -0
- package/dist/components/LiveRegion.d.ts +7 -0
- package/dist/components/LiveRegion.d.ts.map +1 -0
- package/dist/components/Portal.d.ts +8 -0
- package/dist/components/Portal.d.ts.map +1 -0
- package/dist/components/slots/CheckboxItem.d.ts +38 -0
- package/dist/components/slots/CheckboxItem.d.ts.map +1 -0
- package/dist/components/slots/CustomItem.d.ts +35 -0
- package/dist/components/slots/CustomItem.d.ts.map +1 -0
- package/dist/components/slots/FooterActions.d.ts +42 -0
- package/dist/components/slots/FooterActions.d.ts.map +1 -0
- package/dist/components/slots/GroupSeparator.d.ts +30 -0
- package/dist/components/slots/GroupSeparator.d.ts.map +1 -0
- package/dist/components/slots/index.d.ts +9 -0
- package/dist/components/slots/index.d.ts.map +1 -0
- package/dist/components/tabs/TabbedCombo.d.ts +45 -0
- package/dist/components/tabs/TabbedCombo.d.ts.map +1 -0
- package/dist/components/tabs/index.d.ts +3 -0
- package/dist/components/tabs/index.d.ts.map +1 -0
- package/dist/core/announce.d.ts +10 -0
- package/dist/core/announce.d.ts.map +1 -0
- package/dist/core/ids.d.ts +13 -0
- package/dist/core/ids.d.ts.map +1 -0
- package/dist/core/keyboard.d.ts +13 -0
- package/dist/core/keyboard.d.ts.map +1 -0
- package/dist/core/scroll.d.ts +5 -0
- package/dist/core/scroll.d.ts.map +1 -0
- package/dist/core/stateMachine.d.ts +32 -0
- package/dist/core/stateMachine.d.ts.map +1 -0
- package/dist/core/utils.d.ts +26 -0
- package/dist/core/utils.d.ts.map +1 -0
- package/dist/defaults-iFGq2Q-7.cjs +2 -0
- package/dist/defaults-iFGq2Q-7.cjs.map +1 -0
- package/dist/defaults-rhC5DFTg.js +53 -0
- package/dist/defaults-rhC5DFTg.js.map +1 -0
- package/dist/entries/hook-bare.d.ts +4 -0
- package/dist/entries/hook-bare.d.ts.map +1 -0
- package/dist/entries/hook.d.ts +4 -0
- package/dist/entries/hook.d.ts.map +1 -0
- package/dist/entries/icons.d.ts +4 -0
- package/dist/entries/icons.d.ts.map +1 -0
- package/dist/entries/index.d.ts +9 -0
- package/dist/entries/index.d.ts.map +1 -0
- package/dist/entries/position.d.ts +3 -0
- package/dist/entries/position.d.ts.map +1 -0
- package/dist/entries/slots.d.ts +9 -0
- package/dist/entries/slots.d.ts.map +1 -0
- package/dist/entries/tabs.d.ts +4 -0
- package/dist/entries/tabs.d.ts.map +1 -0
- package/dist/hook-bare.cjs +2 -0
- package/dist/hook-bare.cjs.map +1 -0
- package/dist/hook-bare.js +9 -0
- package/dist/hook-bare.js.map +1 -0
- package/dist/hook.cjs +2 -0
- package/dist/hook.cjs.map +1 -0
- package/dist/hook.js +11 -0
- package/dist/hook.js.map +1 -0
- package/dist/hooks/useCombo.d.ts +3 -0
- package/dist/hooks/useCombo.d.ts.map +1 -0
- package/dist/hooks/usePosition.d.ts +16 -0
- package/dist/hooks/usePosition.d.ts.map +1 -0
- package/dist/icons/defaults.d.ts +16 -0
- package/dist/icons/defaults.d.ts.map +1 -0
- package/dist/icons/icons.d.ts +30 -0
- package/dist/icons/icons.d.ts.map +1 -0
- package/dist/icons-Ch1Q5AhF.js +40 -0
- package/dist/icons-Ch1Q5AhF.js.map +1 -0
- package/dist/icons-vzkEacAb.cjs +2 -0
- package/dist/icons-vzkEacAb.cjs.map +1 -0
- package/dist/icons.cjs +2 -0
- package/dist/icons.cjs.map +1 -0
- package/dist/icons.js +20 -0
- package/dist/icons.js.map +1 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/position.cjs +2 -0
- package/dist/position.cjs.map +1 -0
- package/dist/position.js +5 -0
- package/dist/position.js.map +1 -0
- package/dist/slots.cjs +2 -0
- package/dist/slots.cjs.map +1 -0
- package/dist/slots.js +92 -0
- package/dist/slots.js.map +1 -0
- package/dist/style.css +1 -0
- package/dist/styles/base.css +205 -0
- package/dist/styles/checkbox.css +36 -0
- package/dist/styles/chips.css +71 -0
- package/dist/styles/custom-item.css +64 -0
- package/dist/styles/footer.css +73 -0
- package/dist/styles/groups.css +23 -0
- package/dist/styles/meta.css +30 -0
- package/dist/styles/radio.css +36 -0
- package/dist/styles/select.css +35 -0
- package/dist/styles/states.css +22 -0
- package/dist/tabs.cjs +2 -0
- package/dist/tabs.cjs.map +1 -0
- package/dist/tabs.js +132 -0
- package/dist/tabs.js.map +1 -0
- package/dist/themes/dark.css +96 -0
- package/dist/themes/default.css +126 -0
- package/dist/themes/high-contrast.css +98 -0
- package/dist/types.d.ts +168 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/useCombo-D_vriwVz.cjs +2 -0
- package/dist/useCombo-D_vriwVz.cjs.map +1 -0
- package/dist/useCombo-gPeBdkRf.js +887 -0
- package/dist/useCombo-gPeBdkRf.js.map +1 -0
- package/dist/usePosition-6GfutqGX.cjs +2 -0
- package/dist/usePosition-6GfutqGX.cjs.map +1 -0
- package/dist/usePosition-DVw8IlwA.js +36 -0
- package/dist/usePosition-DVw8IlwA.js.map +1 -0
- package/package.json +219 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { IconSlots, ChevronStyle } from '../types';
|
|
3
|
+
export declare const ChevronDownIcon: () => import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
export declare const ArrowDownIcon: () => import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
export declare const AngleDownIcon: () => import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
export declare const PlusMinusIcon: ({ isOpen }: {
|
|
7
|
+
isOpen?: boolean;
|
|
8
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export declare const DotsIcon: () => import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export declare const CheckIcon: () => import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export declare const ClearIcon: () => import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export declare const SearchIcon: () => import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export declare const LoadingIcon: () => import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export declare const defaultIcons: IconSlots;
|
|
15
|
+
export declare const chevronPresets: Record<Exclude<ChevronStyle, 'custom'>, React.ReactNode>;
|
|
16
|
+
//# sourceMappingURL=defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/icons/defaults.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAMxD,eAAO,MAAM,eAAe,+CAI3B,CAAC;AAEF,eAAO,MAAM,aAAa,+CAIzB,CAAC;AAEF,eAAO,MAAM,aAAa,+CAIzB,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,YAAY;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,4CAK7D,CAAC;AAEF,eAAO,MAAM,QAAQ,+CAMpB,CAAC;AAEF,eAAO,MAAM,SAAS,+CAIrB,CAAC;AAEF,eAAO,MAAM,SAAS,+CAIrB,CAAC;AAEF,eAAO,MAAM,UAAU,+CAKtB,CAAC;AAEF,eAAO,MAAM,WAAW,+CAYvB,CAAC;AAMF,eAAO,MAAM,YAAY,EAAE,SAM1B,CAAC;AAMF,eAAO,MAAM,cAAc,EAAE,MAAM,CACjC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,EAC/B,KAAK,CAAC,SAAS,CAQhB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { IconSlots, ChevronStyle } from '../types';
|
|
3
|
+
/**
|
|
4
|
+
* Register a provider for built-in default icons.
|
|
5
|
+
* Called by entry points that want built-in SVGs available.
|
|
6
|
+
*/
|
|
7
|
+
export declare function registerDefaultIcons(provider: () => IconSlots): void;
|
|
8
|
+
/**
|
|
9
|
+
* Register a provider for chevron preset icons.
|
|
10
|
+
* Called by entry points that want built-in chevron presets available.
|
|
11
|
+
*/
|
|
12
|
+
export declare function registerChevronPresets(provider: () => Record<string, ReactNode>): void;
|
|
13
|
+
/**
|
|
14
|
+
* Set global default icons for all Combo instances.
|
|
15
|
+
*/
|
|
16
|
+
export declare function setDefaultIcons(overrides: Partial<IconSlots>): void;
|
|
17
|
+
/**
|
|
18
|
+
* Reset global overrides (useful for tests).
|
|
19
|
+
*/
|
|
20
|
+
export declare function resetDefaultIcons(): void;
|
|
21
|
+
/**
|
|
22
|
+
* Resolve icons with precedence: instance > global > registered defaults.
|
|
23
|
+
* If no provider is registered (hook-bare entry), base is emptyIcons (all null).
|
|
24
|
+
*/
|
|
25
|
+
export declare function resolveIcons(instanceOverrides?: Partial<IconSlots>): IconSlots;
|
|
26
|
+
/**
|
|
27
|
+
* Resolve the chevron icon based on style preset or custom icon.
|
|
28
|
+
*/
|
|
29
|
+
export declare function resolveChevron(style: ChevronStyle, customIcon?: ReactNode): ReactNode;
|
|
30
|
+
//# sourceMappingURL=icons.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/icons/icons.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAqBxD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,SAAS,GAAG,IAAI,CAEpE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GACxC,IAAI,CAEN;AAQD;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAEnE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,iBAAiB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GACrC,SAAS,CAOX;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,YAAY,EACnB,UAAU,CAAC,EAAE,SAAS,GACrB,SAAS,CAKX"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
const o = {
|
|
2
|
+
chevronDown: null,
|
|
3
|
+
check: null,
|
|
4
|
+
clear: null,
|
|
5
|
+
search: null,
|
|
6
|
+
loading: null
|
|
7
|
+
};
|
|
8
|
+
let s = null, l = null;
|
|
9
|
+
function u(e) {
|
|
10
|
+
s = e;
|
|
11
|
+
}
|
|
12
|
+
function c(e) {
|
|
13
|
+
l = e;
|
|
14
|
+
}
|
|
15
|
+
let n = {};
|
|
16
|
+
function a(e) {
|
|
17
|
+
n = { ...n, ...e };
|
|
18
|
+
}
|
|
19
|
+
function i() {
|
|
20
|
+
n = {};
|
|
21
|
+
}
|
|
22
|
+
function f(e) {
|
|
23
|
+
return {
|
|
24
|
+
...s?.() ?? o,
|
|
25
|
+
...n,
|
|
26
|
+
...e
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function v(e, r) {
|
|
30
|
+
return e === "custom" ? r ?? null : e === "none" ? null : (l?.() ?? {})[e] ?? null;
|
|
31
|
+
}
|
|
32
|
+
export {
|
|
33
|
+
u as a,
|
|
34
|
+
i as b,
|
|
35
|
+
f as c,
|
|
36
|
+
v as d,
|
|
37
|
+
c as r,
|
|
38
|
+
a as s
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=icons-Ch1Q5AhF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons-Ch1Q5AhF.js","sources":["../src/icons/icons.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { IconSlots, ChevronStyle } from '../types';\n\n// ---------------------------------------------------------------------------\n// Empty fallback — used when no icon provider is registered (hook-bare entry)\n// ---------------------------------------------------------------------------\n\nconst emptyIcons: IconSlots = {\n chevronDown: null,\n check: null,\n clear: null,\n search: null,\n loading: null,\n};\n\n// ---------------------------------------------------------------------------\n// Lazy provider storage\n// ---------------------------------------------------------------------------\n\nlet defaultIconsProvider: (() => IconSlots) | null = null;\nlet chevronPresetsProvider: (() => Record<string, ReactNode>) | null = null;\n\n/**\n * Register a provider for built-in default icons.\n * Called by entry points that want built-in SVGs available.\n */\nexport function registerDefaultIcons(provider: () => IconSlots): void {\n defaultIconsProvider = provider;\n}\n\n/**\n * Register a provider for chevron preset icons.\n * Called by entry points that want built-in chevron presets available.\n */\nexport function registerChevronPresets(\n provider: () => Record<string, ReactNode>,\n): void {\n chevronPresetsProvider = provider;\n}\n\n// ---------------------------------------------------------------------------\n// Global override storage\n// ---------------------------------------------------------------------------\n\nlet globalOverrides: Partial<IconSlots> = {};\n\n/**\n * Set global default icons for all Combo instances.\n */\nexport function setDefaultIcons(overrides: Partial<IconSlots>): void {\n globalOverrides = { ...globalOverrides, ...overrides };\n}\n\n/**\n * Reset global overrides (useful for tests).\n */\nexport function resetDefaultIcons(): void {\n globalOverrides = {};\n}\n\n/**\n * Resolve icons with precedence: instance > global > registered defaults.\n * If no provider is registered (hook-bare entry), base is emptyIcons (all null).\n */\nexport function resolveIcons(\n instanceOverrides?: Partial<IconSlots>,\n): IconSlots {\n const base = defaultIconsProvider?.() ?? emptyIcons;\n return {\n ...base,\n ...globalOverrides,\n ...instanceOverrides,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Chevron presets\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the chevron icon based on style preset or custom icon.\n */\nexport function resolveChevron(\n style: ChevronStyle,\n customIcon?: ReactNode,\n): ReactNode {\n if (style === 'custom') return customIcon ?? null;\n if (style === 'none') return null;\n const presets = chevronPresetsProvider?.() ?? {};\n return presets[style] ?? null;\n}\n"],"names":["emptyIcons","defaultIconsProvider","chevronPresetsProvider","registerDefaultIcons","provider","registerChevronPresets","globalOverrides","setDefaultIcons","overrides","resetDefaultIcons","resolveIcons","instanceOverrides","resolveChevron","style","customIcon"],"mappings":"AAOA,MAAMA,IAAwB;AAAA,EAC5B,aAAa;AAAA,EACb,OAAO;AAAA,EACP,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,SAAS;AACX;AAMA,IAAIC,IAAiD,MACjDC,IAAmE;AAMhE,SAASC,EAAqBC,GAAiC;AACpE,EAAAH,IAAuBG;AACzB;AAMO,SAASC,EACdD,GACM;AACN,EAAAF,IAAyBE;AAC3B;AAMA,IAAIE,IAAsC,CAAA;AAKnC,SAASC,EAAgBC,GAAqC;AACnE,EAAAF,IAAkB,EAAE,GAAGA,GAAiB,GAAGE,EAAA;AAC7C;AAKO,SAASC,IAA0B;AACxC,EAAAH,IAAkB,CAAA;AACpB;AAMO,SAASI,EACdC,GACW;AAEX,SAAO;AAAA,IACL,GAFWV,SAA4BD;AAAA,IAGvC,GAAGM;AAAA,IACH,GAAGK;AAAA,EAAA;AAEP;AASO,SAASC,EACdC,GACAC,GACW;AACX,SAAID,MAAU,WAAiBC,KAAc,OACzCD,MAAU,SAAe,QACbX,IAAA,KAA8B,CAAA,GAC/BW,CAAK,KAAK;AAC3B;"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const l={chevronDown:null,check:null,clear:null,search:null,loading:null};let s=null,t=null;function o(e){s=e}function u(e){t=e}let n={};function c(e){n={...n,...e}}function i(){n={}}function f(e){return{...s?.()??l,...n,...e}}function a(e,r){return e==="custom"?r??null:e==="none"?null:(t?.()??{})[e]??null}exports.registerChevronPresets=u;exports.registerDefaultIcons=o;exports.resetDefaultIcons=i;exports.resolveChevron=a;exports.resolveIcons=f;exports.setDefaultIcons=c;
|
|
2
|
+
//# sourceMappingURL=icons-vzkEacAb.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons-vzkEacAb.cjs","sources":["../src/icons/icons.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport type { IconSlots, ChevronStyle } from '../types';\n\n// ---------------------------------------------------------------------------\n// Empty fallback — used when no icon provider is registered (hook-bare entry)\n// ---------------------------------------------------------------------------\n\nconst emptyIcons: IconSlots = {\n chevronDown: null,\n check: null,\n clear: null,\n search: null,\n loading: null,\n};\n\n// ---------------------------------------------------------------------------\n// Lazy provider storage\n// ---------------------------------------------------------------------------\n\nlet defaultIconsProvider: (() => IconSlots) | null = null;\nlet chevronPresetsProvider: (() => Record<string, ReactNode>) | null = null;\n\n/**\n * Register a provider for built-in default icons.\n * Called by entry points that want built-in SVGs available.\n */\nexport function registerDefaultIcons(provider: () => IconSlots): void {\n defaultIconsProvider = provider;\n}\n\n/**\n * Register a provider for chevron preset icons.\n * Called by entry points that want built-in chevron presets available.\n */\nexport function registerChevronPresets(\n provider: () => Record<string, ReactNode>,\n): void {\n chevronPresetsProvider = provider;\n}\n\n// ---------------------------------------------------------------------------\n// Global override storage\n// ---------------------------------------------------------------------------\n\nlet globalOverrides: Partial<IconSlots> = {};\n\n/**\n * Set global default icons for all Combo instances.\n */\nexport function setDefaultIcons(overrides: Partial<IconSlots>): void {\n globalOverrides = { ...globalOverrides, ...overrides };\n}\n\n/**\n * Reset global overrides (useful for tests).\n */\nexport function resetDefaultIcons(): void {\n globalOverrides = {};\n}\n\n/**\n * Resolve icons with precedence: instance > global > registered defaults.\n * If no provider is registered (hook-bare entry), base is emptyIcons (all null).\n */\nexport function resolveIcons(\n instanceOverrides?: Partial<IconSlots>,\n): IconSlots {\n const base = defaultIconsProvider?.() ?? emptyIcons;\n return {\n ...base,\n ...globalOverrides,\n ...instanceOverrides,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Chevron presets\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve the chevron icon based on style preset or custom icon.\n */\nexport function resolveChevron(\n style: ChevronStyle,\n customIcon?: ReactNode,\n): ReactNode {\n if (style === 'custom') return customIcon ?? null;\n if (style === 'none') return null;\n const presets = chevronPresetsProvider?.() ?? {};\n return presets[style] ?? null;\n}\n"],"names":["emptyIcons","defaultIconsProvider","chevronPresetsProvider","registerDefaultIcons","provider","registerChevronPresets","globalOverrides","setDefaultIcons","overrides","resetDefaultIcons","resolveIcons","instanceOverrides","resolveChevron","style","customIcon"],"mappings":"aAOA,MAAMA,EAAwB,CAC5B,YAAa,KACb,MAAO,KACP,MAAO,KACP,OAAQ,KACR,QAAS,IACX,EAMA,IAAIC,EAAiD,KACjDC,EAAmE,KAMhE,SAASC,EAAqBC,EAAiC,CACpEH,EAAuBG,CACzB,CAMO,SAASC,EACdD,EACM,CACNF,EAAyBE,CAC3B,CAMA,IAAIE,EAAsC,CAAA,EAKnC,SAASC,EAAgBC,EAAqC,CACnEF,EAAkB,CAAE,GAAGA,EAAiB,GAAGE,CAAA,CAC7C,CAKO,SAASC,GAA0B,CACxCH,EAAkB,CAAA,CACpB,CAMO,SAASI,EACdC,EACW,CAEX,MAAO,CACL,GAFWV,OAA4BD,EAGvC,GAAGM,EACH,GAAGK,CAAA,CAEP,CASO,SAASC,EACdC,EACAC,EACW,CACX,OAAID,IAAU,SAAiBC,GAAc,KACzCD,IAAU,OAAe,MACbX,IAAA,GAA8B,CAAA,GAC/BW,CAAK,GAAK,IAC3B"}
|
package/dist/icons.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./defaults-iFGq2Q-7.cjs"),o=require("./icons-vzkEacAb.cjs");exports.AngleDownIcon=e.AngleDownIcon;exports.ArrowDownIcon=e.ArrowDownIcon;exports.CheckIcon=e.CheckIcon;exports.ChevronDownIcon=e.ChevronDownIcon;exports.ClearIcon=e.ClearIcon;exports.DotsIcon=e.DotsIcon;exports.LoadingIcon=e.LoadingIcon;exports.PlusMinusIcon=e.PlusMinusIcon;exports.SearchIcon=e.SearchIcon;exports.chevronPresets=e.chevronPresets;exports.defaultIcons=e.defaultIcons;exports.registerChevronPresets=o.registerChevronPresets;exports.registerDefaultIcons=o.registerDefaultIcons;exports.resetDefaultIcons=o.resetDefaultIcons;exports.setDefaultIcons=o.setDefaultIcons;
|
|
2
|
+
//# sourceMappingURL=icons.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/dist/icons.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { A as e, a, C as n, b as r, c, D as t, L as I, P as D, S as l, d as f, e as u } from "./defaults-rhC5DFTg.js";
|
|
2
|
+
import { r as C, a as g, b as i, s as w } from "./icons-Ch1Q5AhF.js";
|
|
3
|
+
export {
|
|
4
|
+
e as AngleDownIcon,
|
|
5
|
+
a as ArrowDownIcon,
|
|
6
|
+
n as CheckIcon,
|
|
7
|
+
r as ChevronDownIcon,
|
|
8
|
+
c as ClearIcon,
|
|
9
|
+
t as DotsIcon,
|
|
10
|
+
I as LoadingIcon,
|
|
11
|
+
D as PlusMinusIcon,
|
|
12
|
+
l as SearchIcon,
|
|
13
|
+
f as chevronPresets,
|
|
14
|
+
u as defaultIcons,
|
|
15
|
+
C as registerChevronPresets,
|
|
16
|
+
g as registerDefaultIcons,
|
|
17
|
+
i as resetDefaultIcons,
|
|
18
|
+
w as setDefaultIcons
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=icons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("./hook.cjs");const e=require("./Combo-Cx3kSkop.cjs"),o=require("./icons-vzkEacAb.cjs"),t=require("./useCombo-D_vriwVz.cjs");exports.Combo=e.Combo;exports.LiveRegion=e.LiveRegion;exports.Portal=e.Portal;exports.setDefaultIcons=o.setDefaultIcons;exports.useCombo=t.useCombo;
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import "./hook.js";
|
|
2
|
+
import { C as r, L as a, P as t } from "./Combo-qs6_L512.js";
|
|
3
|
+
import { s as f } from "./icons-Ch1Q5AhF.js";
|
|
4
|
+
import { u as i } from "./useCombo-gPeBdkRf.js";
|
|
5
|
+
export {
|
|
6
|
+
r as Combo,
|
|
7
|
+
a as LiveRegion,
|
|
8
|
+
t as Portal,
|
|
9
|
+
f as setDefaultIcons,
|
|
10
|
+
i as useCombo
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"position.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
package/dist/position.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"position.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
package/dist/slots.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime");function n({label:r,description:o,icon:s}){return e.jsxs("div",{className:"rzero-combo-custom-item",children:[s&&e.jsx("span",{className:"rzero-combo-custom-item-icon","aria-hidden":"true",children:s}),e.jsxs("div",{className:"rzero-combo-custom-item-content",children:[e.jsx("div",{className:"rzero-combo-custom-item-title",children:r}),o&&e.jsx("div",{className:"rzero-combo-custom-item-description",children:o})]})]})}function l({title:r,description:o,icon:s,meta:c,badge:i,children:t}){return e.jsxs("div",{className:"rzero-combo-custom-item",children:[s&&e.jsx("span",{className:"rzero-combo-custom-item-icon","aria-hidden":"true",children:s}),e.jsxs("div",{className:"rzero-combo-custom-item-content",children:[e.jsx("div",{className:"rzero-combo-custom-item-title",children:r}),o&&e.jsx("div",{className:"rzero-combo-custom-item-description",children:o}),t]}),i&&e.jsx("span",{className:"rzero-combo-custom-item-badge",children:i}),c&&e.jsx("span",{className:"rzero-combo-custom-item-meta",children:c})]})}function d({actions:r,note:o,selectedCount:s,totalCount:c}){const i=s!==void 0&&c!==void 0;return e.jsxs("div",{className:"rzero-combo-footer-actions",children:[e.jsxs("div",{children:[i&&e.jsxs("span",{className:"rzero-combo-footer-note",children:[s," of ",c," selected"]}),o&&!i&&e.jsx("span",{className:"rzero-combo-footer-note",children:o})]}),e.jsx("div",{className:"rzero-combo-footer-actions-buttons",children:r.map((t,a)=>e.jsx("button",{type:"button",onClick:t.onClick,disabled:t.disabled,"data-variant":t.variant,onMouseDown:m=>m.preventDefault(),children:t.label},`${t.label}-${a}`))})]})}function u({label:r,count:o,icon:s,sticky:c}){return e.jsxs("div",{className:"rzero-combo-group-header","data-sticky":c||void 0,children:[s&&e.jsx("span",{style:{marginRight:6,display:"inline-flex"},"aria-hidden":"true",children:s}),e.jsx("span",{children:r}),o!==void 0&&e.jsx("span",{className:"rzero-combo-group-header-count",children:o})]})}exports.CheckboxItem=n;exports.CustomItem=l;exports.FooterActions=d;exports.GroupSeparator=u;
|
|
2
|
+
//# sourceMappingURL=slots.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slots.cjs","sources":["../src/components/slots/CheckboxItem.tsx","../src/components/slots/CustomItem.tsx","../src/components/slots/FooterActions.tsx","../src/components/slots/GroupSeparator.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nexport interface CheckboxItemProps {\n /** Display label for the item */\n label: string;\n /** Optional secondary description text */\n description?: string;\n /** Optional leading icon */\n icon?: ReactNode;\n /** Whether the item is currently highlighted */\n isHighlighted?: boolean;\n /** Whether the item is currently selected */\n isSelected?: boolean;\n /** Whether the item is disabled */\n isDisabled?: boolean;\n}\n\n/**\n * Pre-built item content for checkbox-style multi-select.\n * Pair with `itemVariant=\"checkbox\"` on the Combo for CSS-driven checkbox visuals.\n *\n * @example\n * ```tsx\n * <Combo\n * items={items}\n * itemVariant=\"checkbox\"\n * renderItem={({ item, isHighlighted, isSelected, isDisabled }) => (\n * <CheckboxItem\n * label={item.label}\n * description={item.description}\n * isHighlighted={isHighlighted}\n * isSelected={isSelected}\n * isDisabled={isDisabled}\n * />\n * )}\n * />\n * ```\n */\nexport function CheckboxItem({\n label,\n description,\n icon,\n // isHighlighted, isSelected, isDisabled accepted for renderItem type compat;\n // visual states are driven by CSS via parent data-attributes.\n}: CheckboxItemProps) {\n return (\n <div className=\"rzero-combo-custom-item\">\n {icon && (\n <span className=\"rzero-combo-custom-item-icon\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <div className=\"rzero-combo-custom-item-content\">\n <div className=\"rzero-combo-custom-item-title\">{label}</div>\n {description && (\n <div className=\"rzero-combo-custom-item-description\">\n {description}\n </div>\n )}\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport interface CustomItemProps {\n /** Primary label / title */\n title: ReactNode;\n /** Secondary description text */\n description?: ReactNode;\n /** Leading icon or avatar element */\n icon?: ReactNode;\n /** Trailing meta text (e.g. date, status) */\n meta?: ReactNode;\n /** Trailing badge (e.g. count, tag) */\n badge?: ReactNode;\n /** Arbitrary children rendered after title/description */\n children?: ReactNode;\n}\n\n/**\n * Multi-line item layout with icon, title, description, meta, and badge slots.\n *\n * @example\n * ```tsx\n * <Combo\n * items={users}\n * renderItem={({ item }) => (\n * <CustomItem\n * icon={<img src={item.avatar} alt=\"\" />}\n * title={item.name}\n * description={item.role}\n * meta={item.department}\n * />\n * )}\n * />\n * ```\n */\nexport function CustomItem({\n title,\n description,\n icon,\n meta,\n badge,\n children,\n}: CustomItemProps) {\n return (\n <div className=\"rzero-combo-custom-item\">\n {icon && (\n <span className=\"rzero-combo-custom-item-icon\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <div className=\"rzero-combo-custom-item-content\">\n <div className=\"rzero-combo-custom-item-title\">{title}</div>\n {description && (\n <div className=\"rzero-combo-custom-item-description\">\n {description}\n </div>\n )}\n {children}\n </div>\n {badge && (\n <span className=\"rzero-combo-custom-item-badge\">{badge}</span>\n )}\n {meta && (\n <span className=\"rzero-combo-custom-item-meta\">{meta}</span>\n )}\n </div>\n );\n}\n","export interface FooterAction {\n /** Button label */\n label: string;\n /** Click handler */\n onClick: () => void;\n /** Visual variant */\n variant?: 'primary' | 'secondary' | 'ghost';\n /** Disable this action */\n disabled?: boolean;\n}\n\nexport interface FooterActionsProps {\n /** Action buttons to render */\n actions: FooterAction[];\n /** Optional note/help text displayed below or beside actions */\n note?: string;\n /** Number of currently selected items (for summary display) */\n selectedCount?: number;\n /** Total number of items (for summary display) */\n totalCount?: number;\n}\n\n/**\n * Pre-built footer with action buttons and optional selection summary.\n *\n * @example\n * ```tsx\n * <Combo\n * items={items}\n * renderFooter={({ clearSelection, closeMenu }) => (\n * <FooterActions\n * selectedCount={3}\n * totalCount={10}\n * actions={[\n * { label: 'Clear', onClick: clearSelection, variant: 'ghost' },\n * { label: 'Done', onClick: closeMenu, variant: 'primary' },\n * ]}\n * />\n * )}\n * />\n * ```\n */\nexport function FooterActions({\n actions,\n note,\n selectedCount,\n totalCount,\n}: FooterActionsProps) {\n const showStats =\n selectedCount !== undefined && totalCount !== undefined;\n\n return (\n <div className=\"rzero-combo-footer-actions\">\n <div>\n {showStats && (\n <span className=\"rzero-combo-footer-note\">\n {selectedCount} of {totalCount} selected\n </span>\n )}\n {note && !showStats && (\n <span className=\"rzero-combo-footer-note\">{note}</span>\n )}\n </div>\n <div className=\"rzero-combo-footer-actions-buttons\">\n {actions.map((action, i) => (\n <button\n key={`${action.label}-${i}`}\n type=\"button\"\n onClick={action.onClick}\n disabled={action.disabled}\n data-variant={action.variant}\n onMouseDown={(e) => e.preventDefault()}\n >\n {action.label}\n </button>\n ))}\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport interface GroupSeparatorProps {\n /** Group heading label */\n label: string;\n /** Optional item count badge */\n count?: number;\n /** Optional leading icon */\n icon?: ReactNode;\n /** Enable sticky positioning for scrollable lists */\n sticky?: boolean;\n}\n\n/**\n * Enhanced group header with optional count badge and sticky positioning.\n *\n * @example\n * ```tsx\n * <Combo\n * groups={groups}\n * renderGroupHeader={({ group }) => (\n * <GroupSeparator\n * label={group.label}\n * count={group.items.length}\n * sticky\n * />\n * )}\n * />\n * ```\n */\nexport function GroupSeparator({\n label,\n count,\n icon,\n sticky,\n}: GroupSeparatorProps) {\n return (\n <div\n className=\"rzero-combo-group-header\"\n data-sticky={sticky || undefined}\n >\n {icon && (\n <span style={{ marginRight: 6, display: 'inline-flex' }} aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span>{label}</span>\n {count !== undefined && (\n <span className=\"rzero-combo-group-header-count\">{count}</span>\n )}\n </div>\n );\n}\n"],"names":["CheckboxItem","label","description","icon","jsxs","jsx","CustomItem","title","meta","badge","children","FooterActions","actions","note","selectedCount","totalCount","showStats","action","i","e","GroupSeparator","count","sticky"],"mappings":"qHAsCO,SAASA,EAAa,CAC3B,MAAAC,EACA,YAAAC,EACA,KAAAC,CAGF,EAAsB,CACpB,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACZ,SAAA,CAAAD,SACE,OAAA,CAAK,UAAU,+BAA+B,cAAY,OACxD,SAAAA,EACH,EAEFC,EAAAA,KAAC,MAAA,CAAI,UAAU,kCACb,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,gCAAiC,SAAAJ,EAAM,EACrDC,GACCG,EAAAA,IAAC,MAAA,CAAI,UAAU,sCACZ,SAAAH,CAAA,CACH,CAAA,CAAA,CAEJ,CAAA,EACF,CAEJ,CC3BO,SAASI,EAAW,CACzB,MAAAC,EACA,YAAAL,EACA,KAAAC,EACA,KAAAK,EACA,MAAAC,EACA,SAAAC,CACF,EAAoB,CAClB,OACEN,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACZ,SAAA,CAAAD,SACE,OAAA,CAAK,UAAU,+BAA+B,cAAY,OACxD,SAAAA,EACH,EAEFC,EAAAA,KAAC,MAAA,CAAI,UAAU,kCACb,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,gCAAiC,SAAAE,EAAM,EACrDL,GACCG,EAAAA,IAAC,MAAA,CAAI,UAAU,sCACZ,SAAAH,EACH,EAEDQ,CAAA,EACH,EACCD,GACCJ,EAAAA,IAAC,OAAA,CAAK,UAAU,gCAAiC,SAAAI,EAAM,EAExDD,GACCH,EAAAA,IAAC,OAAA,CAAK,UAAU,+BAAgC,SAAAG,CAAA,CAAK,CAAA,EAEzD,CAEJ,CCzBO,SAASG,EAAc,CAC5B,QAAAC,EACA,KAAAC,EACA,cAAAC,EACA,WAAAC,CACF,EAAuB,CACrB,MAAMC,EACJF,IAAkB,QAAaC,IAAe,OAEhD,OACEX,EAAAA,KAAC,MAAA,CAAI,UAAU,6BACb,SAAA,CAAAA,OAAC,MAAA,CACE,SAAA,CAAAY,GACCZ,EAAAA,KAAC,OAAA,CAAK,UAAU,0BACb,SAAA,CAAAU,EAAc,OAAKC,EAAW,WAAA,EACjC,EAEDF,GAAQ,CAACG,SACP,OAAA,CAAK,UAAU,0BAA2B,SAAAH,CAAA,CAAK,CAAA,EAEpD,EACAR,EAAAA,IAAC,OAAI,UAAU,qCACZ,WAAQ,IAAI,CAACY,EAAQC,IACpBb,EAAAA,IAAC,SAAA,CAEC,KAAK,SACL,QAASY,EAAO,QAChB,SAAUA,EAAO,SACjB,eAAcA,EAAO,QACrB,YAAcE,GAAMA,EAAE,eAAA,EAErB,SAAAF,EAAO,KAAA,EAPH,GAAGA,EAAO,KAAK,IAAIC,CAAC,EAAA,CAS5B,CAAA,CACH,CAAA,EACF,CAEJ,CCjDO,SAASE,EAAe,CAC7B,MAAAnB,EACA,MAAAoB,EACA,KAAAlB,EACA,OAAAmB,CACF,EAAwB,CACtB,OACElB,EAAAA,KAAC,MAAA,CACC,UAAU,2BACV,cAAakB,GAAU,OAEtB,SAAA,CAAAnB,GACCE,EAAAA,IAAC,OAAA,CAAK,MAAO,CAAE,YAAa,EAAG,QAAS,aAAA,EAAiB,cAAY,OAClE,SAAAF,CAAA,CACH,EAEFE,EAAAA,IAAC,QAAM,SAAAJ,CAAA,CAAM,EACZoB,IAAU,QACThB,EAAAA,IAAC,OAAA,CAAK,UAAU,iCAAkC,SAAAgB,CAAA,CAAM,CAAA,CAAA,CAAA,CAIhE"}
|
package/dist/slots.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { jsxs as c, jsx as e } from "react/jsx-runtime";
|
|
2
|
+
function d({
|
|
3
|
+
label: s,
|
|
4
|
+
description: o,
|
|
5
|
+
icon: r
|
|
6
|
+
// isHighlighted, isSelected, isDisabled accepted for renderItem type compat;
|
|
7
|
+
// visual states are driven by CSS via parent data-attributes.
|
|
8
|
+
}) {
|
|
9
|
+
return /* @__PURE__ */ c("div", { className: "rzero-combo-custom-item", children: [
|
|
10
|
+
r && /* @__PURE__ */ e("span", { className: "rzero-combo-custom-item-icon", "aria-hidden": "true", children: r }),
|
|
11
|
+
/* @__PURE__ */ c("div", { className: "rzero-combo-custom-item-content", children: [
|
|
12
|
+
/* @__PURE__ */ e("div", { className: "rzero-combo-custom-item-title", children: s }),
|
|
13
|
+
o && /* @__PURE__ */ e("div", { className: "rzero-combo-custom-item-description", children: o })
|
|
14
|
+
] })
|
|
15
|
+
] });
|
|
16
|
+
}
|
|
17
|
+
function h({
|
|
18
|
+
title: s,
|
|
19
|
+
description: o,
|
|
20
|
+
icon: r,
|
|
21
|
+
meta: i,
|
|
22
|
+
badge: t,
|
|
23
|
+
children: a
|
|
24
|
+
}) {
|
|
25
|
+
return /* @__PURE__ */ c("div", { className: "rzero-combo-custom-item", children: [
|
|
26
|
+
r && /* @__PURE__ */ e("span", { className: "rzero-combo-custom-item-icon", "aria-hidden": "true", children: r }),
|
|
27
|
+
/* @__PURE__ */ c("div", { className: "rzero-combo-custom-item-content", children: [
|
|
28
|
+
/* @__PURE__ */ e("div", { className: "rzero-combo-custom-item-title", children: s }),
|
|
29
|
+
o && /* @__PURE__ */ e("div", { className: "rzero-combo-custom-item-description", children: o }),
|
|
30
|
+
a
|
|
31
|
+
] }),
|
|
32
|
+
t && /* @__PURE__ */ e("span", { className: "rzero-combo-custom-item-badge", children: t }),
|
|
33
|
+
i && /* @__PURE__ */ e("span", { className: "rzero-combo-custom-item-meta", children: i })
|
|
34
|
+
] });
|
|
35
|
+
}
|
|
36
|
+
function u({
|
|
37
|
+
actions: s,
|
|
38
|
+
note: o,
|
|
39
|
+
selectedCount: r,
|
|
40
|
+
totalCount: i
|
|
41
|
+
}) {
|
|
42
|
+
const t = r !== void 0 && i !== void 0;
|
|
43
|
+
return /* @__PURE__ */ c("div", { className: "rzero-combo-footer-actions", children: [
|
|
44
|
+
/* @__PURE__ */ c("div", { children: [
|
|
45
|
+
t && /* @__PURE__ */ c("span", { className: "rzero-combo-footer-note", children: [
|
|
46
|
+
r,
|
|
47
|
+
" of ",
|
|
48
|
+
i,
|
|
49
|
+
" selected"
|
|
50
|
+
] }),
|
|
51
|
+
o && !t && /* @__PURE__ */ e("span", { className: "rzero-combo-footer-note", children: o })
|
|
52
|
+
] }),
|
|
53
|
+
/* @__PURE__ */ e("div", { className: "rzero-combo-footer-actions-buttons", children: s.map((a, m) => /* @__PURE__ */ e(
|
|
54
|
+
"button",
|
|
55
|
+
{
|
|
56
|
+
type: "button",
|
|
57
|
+
onClick: a.onClick,
|
|
58
|
+
disabled: a.disabled,
|
|
59
|
+
"data-variant": a.variant,
|
|
60
|
+
onMouseDown: (n) => n.preventDefault(),
|
|
61
|
+
children: a.label
|
|
62
|
+
},
|
|
63
|
+
`${a.label}-${m}`
|
|
64
|
+
)) })
|
|
65
|
+
] });
|
|
66
|
+
}
|
|
67
|
+
function b({
|
|
68
|
+
label: s,
|
|
69
|
+
count: o,
|
|
70
|
+
icon: r,
|
|
71
|
+
sticky: i
|
|
72
|
+
}) {
|
|
73
|
+
return /* @__PURE__ */ c(
|
|
74
|
+
"div",
|
|
75
|
+
{
|
|
76
|
+
className: "rzero-combo-group-header",
|
|
77
|
+
"data-sticky": i || void 0,
|
|
78
|
+
children: [
|
|
79
|
+
r && /* @__PURE__ */ e("span", { style: { marginRight: 6, display: "inline-flex" }, "aria-hidden": "true", children: r }),
|
|
80
|
+
/* @__PURE__ */ e("span", { children: s }),
|
|
81
|
+
o !== void 0 && /* @__PURE__ */ e("span", { className: "rzero-combo-group-header-count", children: o })
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
export {
|
|
87
|
+
d as CheckboxItem,
|
|
88
|
+
h as CustomItem,
|
|
89
|
+
u as FooterActions,
|
|
90
|
+
b as GroupSeparator
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=slots.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slots.js","sources":["../src/components/slots/CheckboxItem.tsx","../src/components/slots/CustomItem.tsx","../src/components/slots/FooterActions.tsx","../src/components/slots/GroupSeparator.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nexport interface CheckboxItemProps {\n /** Display label for the item */\n label: string;\n /** Optional secondary description text */\n description?: string;\n /** Optional leading icon */\n icon?: ReactNode;\n /** Whether the item is currently highlighted */\n isHighlighted?: boolean;\n /** Whether the item is currently selected */\n isSelected?: boolean;\n /** Whether the item is disabled */\n isDisabled?: boolean;\n}\n\n/**\n * Pre-built item content for checkbox-style multi-select.\n * Pair with `itemVariant=\"checkbox\"` on the Combo for CSS-driven checkbox visuals.\n *\n * @example\n * ```tsx\n * <Combo\n * items={items}\n * itemVariant=\"checkbox\"\n * renderItem={({ item, isHighlighted, isSelected, isDisabled }) => (\n * <CheckboxItem\n * label={item.label}\n * description={item.description}\n * isHighlighted={isHighlighted}\n * isSelected={isSelected}\n * isDisabled={isDisabled}\n * />\n * )}\n * />\n * ```\n */\nexport function CheckboxItem({\n label,\n description,\n icon,\n // isHighlighted, isSelected, isDisabled accepted for renderItem type compat;\n // visual states are driven by CSS via parent data-attributes.\n}: CheckboxItemProps) {\n return (\n <div className=\"rzero-combo-custom-item\">\n {icon && (\n <span className=\"rzero-combo-custom-item-icon\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <div className=\"rzero-combo-custom-item-content\">\n <div className=\"rzero-combo-custom-item-title\">{label}</div>\n {description && (\n <div className=\"rzero-combo-custom-item-description\">\n {description}\n </div>\n )}\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport interface CustomItemProps {\n /** Primary label / title */\n title: ReactNode;\n /** Secondary description text */\n description?: ReactNode;\n /** Leading icon or avatar element */\n icon?: ReactNode;\n /** Trailing meta text (e.g. date, status) */\n meta?: ReactNode;\n /** Trailing badge (e.g. count, tag) */\n badge?: ReactNode;\n /** Arbitrary children rendered after title/description */\n children?: ReactNode;\n}\n\n/**\n * Multi-line item layout with icon, title, description, meta, and badge slots.\n *\n * @example\n * ```tsx\n * <Combo\n * items={users}\n * renderItem={({ item }) => (\n * <CustomItem\n * icon={<img src={item.avatar} alt=\"\" />}\n * title={item.name}\n * description={item.role}\n * meta={item.department}\n * />\n * )}\n * />\n * ```\n */\nexport function CustomItem({\n title,\n description,\n icon,\n meta,\n badge,\n children,\n}: CustomItemProps) {\n return (\n <div className=\"rzero-combo-custom-item\">\n {icon && (\n <span className=\"rzero-combo-custom-item-icon\" aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <div className=\"rzero-combo-custom-item-content\">\n <div className=\"rzero-combo-custom-item-title\">{title}</div>\n {description && (\n <div className=\"rzero-combo-custom-item-description\">\n {description}\n </div>\n )}\n {children}\n </div>\n {badge && (\n <span className=\"rzero-combo-custom-item-badge\">{badge}</span>\n )}\n {meta && (\n <span className=\"rzero-combo-custom-item-meta\">{meta}</span>\n )}\n </div>\n );\n}\n","export interface FooterAction {\n /** Button label */\n label: string;\n /** Click handler */\n onClick: () => void;\n /** Visual variant */\n variant?: 'primary' | 'secondary' | 'ghost';\n /** Disable this action */\n disabled?: boolean;\n}\n\nexport interface FooterActionsProps {\n /** Action buttons to render */\n actions: FooterAction[];\n /** Optional note/help text displayed below or beside actions */\n note?: string;\n /** Number of currently selected items (for summary display) */\n selectedCount?: number;\n /** Total number of items (for summary display) */\n totalCount?: number;\n}\n\n/**\n * Pre-built footer with action buttons and optional selection summary.\n *\n * @example\n * ```tsx\n * <Combo\n * items={items}\n * renderFooter={({ clearSelection, closeMenu }) => (\n * <FooterActions\n * selectedCount={3}\n * totalCount={10}\n * actions={[\n * { label: 'Clear', onClick: clearSelection, variant: 'ghost' },\n * { label: 'Done', onClick: closeMenu, variant: 'primary' },\n * ]}\n * />\n * )}\n * />\n * ```\n */\nexport function FooterActions({\n actions,\n note,\n selectedCount,\n totalCount,\n}: FooterActionsProps) {\n const showStats =\n selectedCount !== undefined && totalCount !== undefined;\n\n return (\n <div className=\"rzero-combo-footer-actions\">\n <div>\n {showStats && (\n <span className=\"rzero-combo-footer-note\">\n {selectedCount} of {totalCount} selected\n </span>\n )}\n {note && !showStats && (\n <span className=\"rzero-combo-footer-note\">{note}</span>\n )}\n </div>\n <div className=\"rzero-combo-footer-actions-buttons\">\n {actions.map((action, i) => (\n <button\n key={`${action.label}-${i}`}\n type=\"button\"\n onClick={action.onClick}\n disabled={action.disabled}\n data-variant={action.variant}\n onMouseDown={(e) => e.preventDefault()}\n >\n {action.label}\n </button>\n ))}\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\nexport interface GroupSeparatorProps {\n /** Group heading label */\n label: string;\n /** Optional item count badge */\n count?: number;\n /** Optional leading icon */\n icon?: ReactNode;\n /** Enable sticky positioning for scrollable lists */\n sticky?: boolean;\n}\n\n/**\n * Enhanced group header with optional count badge and sticky positioning.\n *\n * @example\n * ```tsx\n * <Combo\n * groups={groups}\n * renderGroupHeader={({ group }) => (\n * <GroupSeparator\n * label={group.label}\n * count={group.items.length}\n * sticky\n * />\n * )}\n * />\n * ```\n */\nexport function GroupSeparator({\n label,\n count,\n icon,\n sticky,\n}: GroupSeparatorProps) {\n return (\n <div\n className=\"rzero-combo-group-header\"\n data-sticky={sticky || undefined}\n >\n {icon && (\n <span style={{ marginRight: 6, display: 'inline-flex' }} aria-hidden=\"true\">\n {icon}\n </span>\n )}\n <span>{label}</span>\n {count !== undefined && (\n <span className=\"rzero-combo-group-header-count\">{count}</span>\n )}\n </div>\n );\n}\n"],"names":["CheckboxItem","label","description","icon","jsxs","jsx","CustomItem","title","meta","badge","children","FooterActions","actions","note","selectedCount","totalCount","showStats","action","i","e","GroupSeparator","count","sticky"],"mappings":";AAsCO,SAASA,EAAa;AAAA,EAC3B,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,MAAAC;AAAA;AAAA;AAGF,GAAsB;AACpB,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,IAAAD,uBACE,QAAA,EAAK,WAAU,gCAA+B,eAAY,QACxD,UAAAA,GACH;AAAA,IAEF,gBAAAC,EAAC,OAAA,EAAI,WAAU,mCACb,UAAA;AAAA,MAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,iCAAiC,UAAAJ,GAAM;AAAA,MACrDC,KACC,gBAAAG,EAAC,OAAA,EAAI,WAAU,uCACZ,UAAAH,EAAA,CACH;AAAA,IAAA,EAAA,CAEJ;AAAA,EAAA,GACF;AAEJ;AC3BO,SAASI,EAAW;AAAA,EACzB,OAAAC;AAAA,EACA,aAAAL;AAAA,EACA,MAAAC;AAAA,EACA,MAAAK;AAAA,EACA,OAAAC;AAAA,EACA,UAAAC;AACF,GAAoB;AAClB,SACE,gBAAAN,EAAC,OAAA,EAAI,WAAU,2BACZ,UAAA;AAAA,IAAAD,uBACE,QAAA,EAAK,WAAU,gCAA+B,eAAY,QACxD,UAAAA,GACH;AAAA,IAEF,gBAAAC,EAAC,OAAA,EAAI,WAAU,mCACb,UAAA;AAAA,MAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,iCAAiC,UAAAE,GAAM;AAAA,MACrDL,KACC,gBAAAG,EAAC,OAAA,EAAI,WAAU,uCACZ,UAAAH,GACH;AAAA,MAEDQ;AAAA,IAAA,GACH;AAAA,IACCD,KACC,gBAAAJ,EAAC,QAAA,EAAK,WAAU,iCAAiC,UAAAI,GAAM;AAAA,IAExDD,KACC,gBAAAH,EAAC,QAAA,EAAK,WAAU,gCAAgC,UAAAG,EAAA,CAAK;AAAA,EAAA,GAEzD;AAEJ;ACzBO,SAASG,EAAc;AAAA,EAC5B,SAAAC;AAAA,EACA,MAAAC;AAAA,EACA,eAAAC;AAAA,EACA,YAAAC;AACF,GAAuB;AACrB,QAAMC,IACJF,MAAkB,UAAaC,MAAe;AAEhD,SACE,gBAAAX,EAAC,OAAA,EAAI,WAAU,8BACb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EACE,UAAA;AAAA,MAAAY,KACC,gBAAAZ,EAAC,QAAA,EAAK,WAAU,2BACb,UAAA;AAAA,QAAAU;AAAA,QAAc;AAAA,QAAKC;AAAA,QAAW;AAAA,MAAA,GACjC;AAAA,MAEDF,KAAQ,CAACG,uBACP,QAAA,EAAK,WAAU,2BAA2B,UAAAH,EAAA,CAAK;AAAA,IAAA,GAEpD;AAAA,IACA,gBAAAR,EAAC,SAAI,WAAU,sCACZ,YAAQ,IAAI,CAACY,GAAQC,MACpB,gBAAAb;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,MAAK;AAAA,QACL,SAASY,EAAO;AAAA,QAChB,UAAUA,EAAO;AAAA,QACjB,gBAAcA,EAAO;AAAA,QACrB,aAAa,CAACE,MAAMA,EAAE,eAAA;AAAA,QAErB,UAAAF,EAAO;AAAA,MAAA;AAAA,MAPH,GAAGA,EAAO,KAAK,IAAIC,CAAC;AAAA,IAAA,CAS5B,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;ACjDO,SAASE,EAAe;AAAA,EAC7B,OAAAnB;AAAA,EACA,OAAAoB;AAAA,EACA,MAAAlB;AAAA,EACA,QAAAmB;AACF,GAAwB;AACtB,SACE,gBAAAlB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAakB,KAAU;AAAA,MAEtB,UAAA;AAAA,QAAAnB,KACC,gBAAAE,EAAC,QAAA,EAAK,OAAO,EAAE,aAAa,GAAG,SAAS,cAAA,GAAiB,eAAY,QAClE,UAAAF,EAAA,CACH;AAAA,QAEF,gBAAAE,EAAC,UAAM,UAAAJ,EAAA,CAAM;AAAA,QACZoB,MAAU,UACT,gBAAAhB,EAAC,QAAA,EAAK,WAAU,kCAAkC,UAAAgB,EAAA,CAAM;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIhE;"}
|
package/dist/style.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.rzero-combo{position:relative;display:inline-flex;flex-direction:column;width:100%;font-family:inherit;color:var(--rzero-combo-item-color, #374151)}.rzero-combo-trigger{display:flex;align-items:center;gap:4px;border:var(--rzero-combo-input-border, 1px solid #d1d5db);border-radius:var(--rzero-combo-input-border-radius, 6px);background:var(--rzero-combo-input-bg, #ffffff);padding:var(--rzero-combo-input-padding, 8px 12px);min-height:var(--rzero-combo-input-height, 40px);font-size:var(--rzero-combo-input-font-size, 14px);color:var(--rzero-combo-input-color, #111827);cursor:text;transition:box-shadow .15s ease,border-color .15s ease}.rzero-combo-trigger:hover:not([data-disabled]){border-color:var(--rzero-combo-input-hover-border, #9ca3af)}.rzero-combo-trigger:focus-within{box-shadow:var(--rzero-combo-input-focus-ring, 0 0 0 2px #3b82f6)}.rzero-combo-trigger[data-error]{border-color:var(--rzero-combo-error-border, #dc2626)}.rzero-combo-trigger[data-error]:focus-within{box-shadow:var(--rzero-combo-error-focus-ring, 0 0 0 2px #dc2626)}.rzero-combo-select-trigger[data-error]{border-color:var(--rzero-combo-error-border, #dc2626)}.rzero-combo-select-trigger[data-error]:focus{box-shadow:var(--rzero-combo-error-focus-ring, 0 0 0 2px #dc2626)}.rzero-combo-trigger[data-has-hidden-selection]{border-left:var(--rzero-combo-hidden-selection-border, 3px solid #3b82f6)}.rzero-combo-trigger input{flex:1;border:none;outline:none;background:transparent;font:inherit;color:inherit;min-width:0;padding:0}.rzero-combo-trigger input::placeholder{color:var(--rzero-combo-icon-muted-color, #9ca3af)}[data-rzero-trigger][data-disabled]{opacity:.5;cursor:not-allowed;pointer-events:none}[data-rzero-trigger][data-readonly]{cursor:default}[data-rzero-trigger][data-loading]{cursor:wait}.rzero-combo-list{list-style:none;margin:0;padding:4px 0;background:var(--rzero-combo-popover-bg, #ffffff);color:var(--rzero-combo-item-color, #374151);border:var(--rzero-combo-popover-border, 1px solid #e5e7eb);border-radius:var(--rzero-combo-popover-border-radius, 8px);box-shadow:var(--rzero-combo-popover-shadow, 0 8px 24px rgba(0,0,0,.12));z-index:var(--rzero-combo-z-index, 9999)}.rzero-combo-list[data-state=closed]{display:none}.rzero-combo-item{display:flex;align-items:center;justify-content:space-between;min-height:var(--rzero-combo-item-height, 36px);padding:var(--rzero-combo-item-padding, 0 12px);color:var(--rzero-combo-item-color, #374151);cursor:pointer;user-select:none}.rzero-combo-item[data-highlighted]{background:var(--rzero-combo-item-highlighted-bg, #dbeafe)}.rzero-combo-item[data-selected]{background:var(--rzero-combo-item-selected-bg, #eff6ff);color:var(--rzero-combo-item-selected-color, #1d4ed8)}.rzero-combo-item[data-disabled]{opacity:var(--rzero-combo-item-disabled-opacity, .4);cursor:not-allowed}.rzero-combo-check{display:flex;align-items:center;margin-left:8px}.rzero-combo-trigger button{display:flex;align-items:center;justify-content:center;background:none;border:none;cursor:pointer;color:var(--rzero-combo-icon-muted-color, #9ca3af);padding:4px;min-width:24px;min-height:24px;flex-shrink:0}.rzero-combo-trigger button:hover{color:var(--rzero-combo-icon-color, currentColor)}[data-rzero-chevron]{display:inline-flex;transition:transform var(--rzero-combo-transition-duration, .15s) var(--rzero-combo-transition-easing, ease)}[aria-expanded=true] [data-rzero-chevron]{transform:rotate(180deg)}@keyframes rzero-spin{to{transform:rotate(360deg)}}.rzero-combo-group-header{color:var(--rzero-combo-group-header-color, #6b7280);font-size:var(--rzero-combo-group-header-font-size, 11px);font-weight:var(--rzero-combo-group-header-font-weight, 600);text-transform:var(--rzero-combo-group-header-text-transform, uppercase);letter-spacing:var(--rzero-combo-group-header-letter-spacing, .05em);padding:8px 12px 4px}[data-rzero-chevron] svg,.rzero-combo-check svg{width:var(--rzero-combo-icon-size-md, 16px);height:var(--rzero-combo-icon-size-md, 16px)}.rzero-combo-label{display:block;font-size:var(--rzero-combo-label-font-size, 14px);font-weight:var(--rzero-combo-label-font-weight, 500);color:var(--rzero-combo-label-color, #374151);margin-bottom:var(--rzero-combo-label-margin-bottom, 6px)}@media (prefers-reduced-motion: reduce){.rzero-combo,.rzero-combo *,.rzero-combo *:before,.rzero-combo *:after{transition-duration:0s!important;animation-duration:0s!important}}.rzero-combo-select-trigger{display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;border:var(--rzero-combo-input-border, 1px solid #d1d5db);border-radius:var(--rzero-combo-input-border-radius, 6px);background:var(--rzero-combo-input-bg, #ffffff);padding:var(--rzero-combo-input-padding, 8px 12px);min-height:var(--rzero-combo-input-height, 40px);font-size:var(--rzero-combo-input-font-size, 14px);color:var(--rzero-combo-input-color, #111827);cursor:pointer;transition:box-shadow .15s ease,border-color .15s ease}.rzero-combo-select-trigger:focus-visible{box-shadow:var(--rzero-combo-input-focus-ring, 0 0 0 2px #3b82f6);outline:none}.rzero-combo-select-trigger:disabled{opacity:.5;cursor:not-allowed}.rzero-combo-select-value{flex:1;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rzero-combo-empty,.rzero-combo-loading{display:flex;align-items:center;justify-content:center;min-height:var(--rzero-combo-item-height, 36px);padding:var(--rzero-combo-item-padding, 0 12px);color:var(--rzero-combo-icon-muted-color, #9ca3af);font-size:var(--rzero-combo-input-font-size, 14px)}.rzero-combo-error{display:flex;align-items:center;justify-content:center;min-height:var(--rzero-combo-item-height, 36px);padding:var(--rzero-combo-item-padding, 0 12px);color:var(--rzero-combo-error-color, #dc2626);font-size:var(--rzero-combo-input-font-size, 14px)}.rzero-combo-footer{border-top:var(--rzero-combo-footer-border-top, 1px solid #e5e7eb);padding:var(--rzero-combo-footer-padding, 8px 12px);font-size:var(--rzero-combo-input-font-size, 14px);color:var(--rzero-combo-footer-color, #6b7280)}.rzero-combo-footer-actions{display:flex;align-items:center;justify-content:space-between;gap:8px}.rzero-combo-footer-actions-buttons{display:flex;gap:6px}.rzero-combo-footer-actions button{padding:4px 12px;border:var(--rzero-combo-footer-action-border, 1px solid #d1d5db);border-radius:var(--rzero-combo-footer-action-border-radius, 4px);background:var(--rzero-combo-footer-action-bg, transparent);color:var(--rzero-combo-footer-action-color, #374151);font-size:var(--rzero-combo-footer-action-font-size, 13px);cursor:pointer;transition:background .15s ease}.rzero-combo-footer-actions button:hover{background:var(--rzero-combo-footer-action-hover-bg, #f3f4f6)}.rzero-combo-footer-actions button[data-variant=primary]{background:var(--rzero-combo-footer-action-primary-bg, #3b82f6);color:var(--rzero-combo-footer-action-primary-color, #ffffff);border-color:var(--rzero-combo-footer-action-primary-bg, #3b82f6)}.rzero-combo-footer-actions button[data-variant=primary]:hover{background:var(--rzero-combo-footer-action-primary-hover-bg, #2563eb)}.rzero-combo-footer-actions button[data-variant=ghost]{border-color:transparent;background:transparent}.rzero-combo-footer-actions button[data-variant=ghost]:hover{background:var(--rzero-combo-footer-action-hover-bg, #f3f4f6)}.rzero-combo-footer-actions button:disabled{opacity:.5;cursor:not-allowed}.rzero-combo-footer-note{font-size:var(--rzero-combo-footer-note-font-size, 12px);color:var(--rzero-combo-footer-note-color, #9ca3af)}.rzero-combo-separator{height:1px;background:var(--rzero-combo-separator-color, #e5e7eb);margin:4px 0;border:none}.rzero-combo-group-header[data-sticky]{position:sticky;top:0;background:var(--rzero-combo-popover-bg, #ffffff);z-index:1}.rzero-combo-group-header-count{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:var(--rzero-combo-group-header-count-bg, #e5e7eb);color:var(--rzero-combo-group-header-count-color, #6b7280);font-size:10px;font-weight:600;margin-left:6px}.rzero-combo-item[data-variant=checkbox]{gap:8px;justify-content:flex-start}.rzero-combo-item[data-variant=checkbox]:before{content:"";flex-shrink:0;width:var(--rzero-combo-checkbox-size, 16px);height:var(--rzero-combo-checkbox-size, 16px);border:2px solid var(--rzero-combo-checkbox-border, #d1d5db);border-radius:var(--rzero-combo-checkbox-radius, 3px);background:var(--rzero-combo-checkbox-bg, #ffffff);transition:background .15s ease,border-color .15s ease}.rzero-combo-item[data-variant=checkbox][data-selected]:before{background:var(--rzero-combo-checkbox-checked-bg, #3b82f6);border-color:var(--rzero-combo-checkbox-checked-border, #3b82f6);background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='white'%3E%3Cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3E%3C/svg%3E");background-size:12px 12px;background-position:center;background-repeat:no-repeat}.rzero-combo-item[data-variant=checkbox][data-highlighted]:before{border-color:var(--rzero-combo-checkbox-hover-border, #9ca3af)}.rzero-combo-item[data-variant=checkbox][data-selected][data-highlighted]:before{border-color:var(--rzero-combo-checkbox-checked-border, #3b82f6)}.rzero-combo-item[data-variant=radio]{gap:8px;justify-content:flex-start}.rzero-combo-item[data-variant=radio]:before{content:"";flex-shrink:0;width:var(--rzero-combo-radio-size, 16px);height:var(--rzero-combo-radio-size, 16px);border:2px solid var(--rzero-combo-radio-border, #d1d5db);border-radius:50%;background:var(--rzero-combo-radio-bg, #ffffff);transition:background .15s ease,border-color .15s ease}.rzero-combo-item[data-variant=radio][data-selected]:before{border-color:var(--rzero-combo-radio-checked-border, #3b82f6);background:radial-gradient(circle,var(--rzero-combo-radio-checked-dot, #3b82f6) 35%,transparent 36%)}.rzero-combo-item[data-variant=radio][data-highlighted]:before{border-color:var(--rzero-combo-radio-hover-border, #9ca3af)}.rzero-combo-item[data-variant=radio][data-selected][data-highlighted]:before{border-color:var(--rzero-combo-radio-checked-border, #3b82f6)}.rzero-combo-custom-item{display:flex;align-items:flex-start;gap:10px;padding:4px 0;width:100%}.rzero-combo-custom-item-icon{flex-shrink:0;width:var(--rzero-combo-custom-item-icon-size, 32px);height:var(--rzero-combo-custom-item-icon-size, 32px);display:flex;align-items:center;justify-content:center;border-radius:var(--rzero-combo-custom-item-icon-radius, 6px);overflow:hidden}.rzero-combo-custom-item-content{flex:1;min-width:0}.rzero-combo-custom-item-title{font-weight:500;color:inherit;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rzero-combo-custom-item-description{font-size:var(--rzero-combo-item-description-font-size, 12px);color:var(--rzero-combo-item-description-color, #6b7280);line-height:1.3;margin-top:1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rzero-combo-custom-item-meta{flex-shrink:0;font-size:var(--rzero-combo-item-meta-font-size, 12px);color:var(--rzero-combo-item-meta-color, #9ca3af);align-self:center}.rzero-combo-custom-item-badge{display:inline-flex;align-items:center;padding:1px 6px;border-radius:var(--rzero-combo-badge-radius, 10px);background:var(--rzero-combo-badge-bg, #e5e7eb);color:var(--rzero-combo-badge-color, #374151);font-size:var(--rzero-combo-badge-font-size, 11px);font-weight:500}.rzero-combo-trigger--multi{flex-wrap:nowrap;gap:4px;padding:var(--rzero-combo-input-padding-multi, 4px 8px);align-items:flex-start}.rzero-combo-trigger-content{display:flex;flex-wrap:wrap;gap:4px;align-items:center;flex:1 1 0%;min-width:0}.rzero-combo-trigger-content input{flex:1 1 60px;min-width:60px;padding:2px 4px}.rzero-combo-trigger-actions{display:flex;align-items:center;gap:2px;flex-shrink:0;padding-top:2px}.rzero-combo-chip{display:inline-flex;align-items:center;gap:2px;padding:var(--rzero-combo-chip-padding, 2px 6px);background:var(--rzero-combo-chip-bg, #e5e7eb);color:var(--rzero-combo-chip-color, #374151);border-radius:var(--rzero-combo-chip-radius, 4px);font-size:var(--rzero-combo-chip-font-size, 13px);line-height:1.4;max-width:150px}.rzero-combo-chip-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rzero-combo-chip-remove{display:inline-flex;align-items:center;justify-content:center;background:none;border:none;cursor:pointer;padding:0;margin-left:2px;color:var(--rzero-combo-chip-remove-color, #6b7280);border-radius:2px;flex-shrink:0}.rzero-combo-chip-remove:hover{color:var(--rzero-combo-chip-remove-hover-color, #111827);background:var(--rzero-combo-chip-remove-hover-bg, rgba(0,0,0,.08))}.rzero-combo-meta{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-top:var(--rzero-combo-meta-margin-top, 4px);font-size:var(--rzero-combo-meta-font-size, 12px);line-height:1.4}.rzero-combo-hint{color:var(--rzero-combo-hint-color, #6b7280)}.rzero-combo-error-text{color:var(--rzero-combo-error-text-color, #dc2626)}.rzero-combo-selection-count{color:var(--rzero-combo-selection-count-color, #9ca3af);white-space:nowrap;margin-left:auto}.rzero-combo-selection-count[data-warning]{color:var(--rzero-combo-selection-count-warning-color, #f59e0b)}.rzero-combo-tabs{display:flex;align-items:stretch;border-bottom:1px solid var(--rzero-combo-tab-border-color, #e5e7eb);padding:0 4px;gap:0;overflow-x:auto;scrollbar-width:none}.rzero-combo-tabs::-webkit-scrollbar{display:none}.rzero-combo-tab{display:inline-flex;align-items:center;gap:6px;padding:var(--rzero-combo-tab-padding, 8px 12px);border:none;background:var(--rzero-combo-tab-bg, transparent);color:var(--rzero-combo-tab-color, #6b7280);font-size:var(--rzero-combo-tab-font-size, 13px);font-weight:var(--rzero-combo-tab-font-weight, 500);cursor:pointer;white-space:nowrap;border-bottom:2px solid transparent;margin-bottom:-1px;transition:color .15s ease,border-color .15s ease,background .15s ease}.rzero-combo-tab:hover{background:var(--rzero-combo-tab-hover-bg, #f3f4f6);color:var(--rzero-combo-tab-hover-color, #374151)}.rzero-combo-tab:focus-visible{outline:2px solid var(--rzero-combo-tab-focus-ring, #3b82f6);outline-offset:-2px;border-radius:2px}.rzero-combo-tab[data-active]{color:var(--rzero-combo-tab-active-color, #111827);border-bottom-color:var(--rzero-combo-tab-active-border-color, #3b82f6);background:var(--rzero-combo-tab-active-bg, transparent)}.rzero-combo-tab[data-disabled]{opacity:.5;cursor:not-allowed}.rzero-combo-tab-badge{display:inline-flex;align-items:center;justify-content:center;min-width:18px;height:18px;padding:0 5px;border-radius:9px;background:var(--rzero-combo-tab-badge-bg, #e5e7eb);color:var(--rzero-combo-tab-badge-color, #6b7280);font-size:11px;font-weight:600;line-height:1}.rzero-combo-tab[data-active] .rzero-combo-tab-badge{background:var(--rzero-combo-tab-badge-active-bg, #dbeafe);color:var(--rzero-combo-tab-badge-active-color, #1d4ed8)}.rzero-combo-tab-panel{outline:none}.rzero-combo-tab-icon{display:inline-flex;align-items:center}.rzero-combo-tab-icon svg{width:var(--rzero-combo-icon-size-sm, 14px);height:var(--rzero-combo-icon-size-sm, 14px)}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/* Base structural styles — no colors, no theme opinions.
|
|
2
|
+
All visual values use CSS custom properties. */
|
|
3
|
+
|
|
4
|
+
.rzero-combo {
|
|
5
|
+
position: relative;
|
|
6
|
+
display: inline-flex;
|
|
7
|
+
flex-direction: column;
|
|
8
|
+
width: 100%;
|
|
9
|
+
font-family: inherit;
|
|
10
|
+
color: var(--rzero-combo-item-color, #374151);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/* Trigger */
|
|
14
|
+
.rzero-combo-trigger {
|
|
15
|
+
display: flex;
|
|
16
|
+
align-items: center;
|
|
17
|
+
gap: 4px;
|
|
18
|
+
border: var(--rzero-combo-input-border, 1px solid #d1d5db);
|
|
19
|
+
border-radius: var(--rzero-combo-input-border-radius, 6px);
|
|
20
|
+
background: var(--rzero-combo-input-bg, #ffffff);
|
|
21
|
+
padding: var(--rzero-combo-input-padding, 8px 12px);
|
|
22
|
+
min-height: var(--rzero-combo-input-height, 40px);
|
|
23
|
+
font-size: var(--rzero-combo-input-font-size, 14px);
|
|
24
|
+
color: var(--rzero-combo-input-color, #111827);
|
|
25
|
+
cursor: text;
|
|
26
|
+
transition: box-shadow 150ms ease, border-color 150ms ease;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.rzero-combo-trigger:hover:not([data-disabled]) {
|
|
30
|
+
border-color: var(--rzero-combo-input-hover-border, #9ca3af);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.rzero-combo-trigger:focus-within {
|
|
34
|
+
box-shadow: var(--rzero-combo-input-focus-ring, 0 0 0 2px #3b82f6);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.rzero-combo-trigger[data-error] {
|
|
38
|
+
border-color: var(--rzero-combo-error-border, #dc2626);
|
|
39
|
+
}
|
|
40
|
+
.rzero-combo-trigger[data-error]:focus-within {
|
|
41
|
+
box-shadow: var(--rzero-combo-error-focus-ring, 0 0 0 2px #dc2626);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* Select variant trigger error */
|
|
45
|
+
.rzero-combo-select-trigger[data-error] {
|
|
46
|
+
border-color: var(--rzero-combo-error-border, #dc2626);
|
|
47
|
+
}
|
|
48
|
+
.rzero-combo-select-trigger[data-error]:focus {
|
|
49
|
+
box-shadow: var(--rzero-combo-error-focus-ring, 0 0 0 2px #dc2626);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* Subtle indicator when a selection exists but search text replaced the display */
|
|
53
|
+
.rzero-combo-trigger[data-has-hidden-selection] {
|
|
54
|
+
border-left: var(--rzero-combo-hidden-selection-border, 3px solid #3b82f6);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.rzero-combo-trigger input {
|
|
58
|
+
flex: 1;
|
|
59
|
+
border: none;
|
|
60
|
+
outline: none;
|
|
61
|
+
background: transparent;
|
|
62
|
+
font: inherit;
|
|
63
|
+
color: inherit;
|
|
64
|
+
min-width: 0;
|
|
65
|
+
padding: 0;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.rzero-combo-trigger input::placeholder {
|
|
69
|
+
color: var(--rzero-combo-icon-muted-color, #9ca3af);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/* Disabled / readonly trigger states */
|
|
73
|
+
[data-rzero-trigger][data-disabled] {
|
|
74
|
+
opacity: 0.5;
|
|
75
|
+
cursor: not-allowed;
|
|
76
|
+
pointer-events: none;
|
|
77
|
+
}
|
|
78
|
+
[data-rzero-trigger][data-readonly] {
|
|
79
|
+
cursor: default;
|
|
80
|
+
}
|
|
81
|
+
[data-rzero-trigger][data-loading] {
|
|
82
|
+
cursor: wait;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* Popover / listbox */
|
|
86
|
+
.rzero-combo-list {
|
|
87
|
+
list-style: none;
|
|
88
|
+
margin: 0;
|
|
89
|
+
padding: 4px 0;
|
|
90
|
+
background: var(--rzero-combo-popover-bg, #ffffff);
|
|
91
|
+
color: var(--rzero-combo-item-color, #374151);
|
|
92
|
+
border: var(--rzero-combo-popover-border, 1px solid #e5e7eb);
|
|
93
|
+
border-radius: var(--rzero-combo-popover-border-radius, 8px);
|
|
94
|
+
box-shadow: var(--rzero-combo-popover-shadow, 0 8px 24px rgba(0,0,0,0.12));
|
|
95
|
+
z-index: var(--rzero-combo-z-index, 9999);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.rzero-combo-list[data-state="closed"] {
|
|
99
|
+
display: none;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* Items */
|
|
103
|
+
.rzero-combo-item {
|
|
104
|
+
display: flex;
|
|
105
|
+
align-items: center;
|
|
106
|
+
justify-content: space-between;
|
|
107
|
+
min-height: var(--rzero-combo-item-height, 36px);
|
|
108
|
+
padding: var(--rzero-combo-item-padding, 0 12px);
|
|
109
|
+
color: var(--rzero-combo-item-color, #374151);
|
|
110
|
+
cursor: pointer;
|
|
111
|
+
user-select: none;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.rzero-combo-item[data-highlighted] {
|
|
115
|
+
background: var(--rzero-combo-item-highlighted-bg, #dbeafe);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.rzero-combo-item[data-selected] {
|
|
119
|
+
background: var(--rzero-combo-item-selected-bg, #eff6ff);
|
|
120
|
+
color: var(--rzero-combo-item-selected-color, #1d4ed8);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.rzero-combo-item[data-disabled] {
|
|
124
|
+
opacity: var(--rzero-combo-item-disabled-opacity, 0.4);
|
|
125
|
+
cursor: not-allowed;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/* Check icon in items */
|
|
129
|
+
.rzero-combo-check {
|
|
130
|
+
display: flex;
|
|
131
|
+
align-items: center;
|
|
132
|
+
margin-left: 8px;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/* Toggle / clear buttons */
|
|
136
|
+
.rzero-combo-trigger button {
|
|
137
|
+
display: flex;
|
|
138
|
+
align-items: center;
|
|
139
|
+
justify-content: center;
|
|
140
|
+
background: none;
|
|
141
|
+
border: none;
|
|
142
|
+
cursor: pointer;
|
|
143
|
+
color: var(--rzero-combo-icon-muted-color, #9ca3af);
|
|
144
|
+
padding: 4px;
|
|
145
|
+
min-width: 24px;
|
|
146
|
+
min-height: 24px;
|
|
147
|
+
flex-shrink: 0;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
.rzero-combo-trigger button:hover {
|
|
151
|
+
color: var(--rzero-combo-icon-color, currentColor);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/* Chevron animation */
|
|
155
|
+
[data-rzero-chevron] {
|
|
156
|
+
display: inline-flex;
|
|
157
|
+
transition: transform var(--rzero-combo-transition-duration, 150ms)
|
|
158
|
+
var(--rzero-combo-transition-easing, ease);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
[aria-expanded="true"] [data-rzero-chevron] {
|
|
162
|
+
transform: rotate(180deg);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/* Loading spinner keyframe */
|
|
166
|
+
@keyframes rzero-spin {
|
|
167
|
+
to { transform: rotate(360deg); }
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/* Group headers */
|
|
171
|
+
.rzero-combo-group-header {
|
|
172
|
+
color: var(--rzero-combo-group-header-color, #6b7280);
|
|
173
|
+
font-size: var(--rzero-combo-group-header-font-size, 11px);
|
|
174
|
+
font-weight: var(--rzero-combo-group-header-font-weight, 600);
|
|
175
|
+
text-transform: var(--rzero-combo-group-header-text-transform, uppercase);
|
|
176
|
+
letter-spacing: var(--rzero-combo-group-header-letter-spacing, 0.05em);
|
|
177
|
+
padding: 8px 12px 4px;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/* Icon sizing */
|
|
181
|
+
[data-rzero-chevron] svg,
|
|
182
|
+
.rzero-combo-check svg {
|
|
183
|
+
width: var(--rzero-combo-icon-size-md, 16px);
|
|
184
|
+
height: var(--rzero-combo-icon-size-md, 16px);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/* Label */
|
|
188
|
+
.rzero-combo-label {
|
|
189
|
+
display: block;
|
|
190
|
+
font-size: var(--rzero-combo-label-font-size, 14px);
|
|
191
|
+
font-weight: var(--rzero-combo-label-font-weight, 500);
|
|
192
|
+
color: var(--rzero-combo-label-color, #374151);
|
|
193
|
+
margin-bottom: var(--rzero-combo-label-margin-bottom, 6px);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/* Reduced motion */
|
|
197
|
+
@media (prefers-reduced-motion: reduce) {
|
|
198
|
+
.rzero-combo,
|
|
199
|
+
.rzero-combo *,
|
|
200
|
+
.rzero-combo *::before,
|
|
201
|
+
.rzero-combo *::after {
|
|
202
|
+
transition-duration: 0s !important;
|
|
203
|
+
animation-duration: 0s !important;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/* ------------------------------------------------------------------ */
|
|
2
|
+
/* Checkbox variant — pure CSS via ::before pseudo-element */
|
|
3
|
+
/* ------------------------------------------------------------------ */
|
|
4
|
+
|
|
5
|
+
.rzero-combo-item[data-variant="checkbox"] {
|
|
6
|
+
gap: 8px;
|
|
7
|
+
justify-content: flex-start;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.rzero-combo-item[data-variant="checkbox"]::before {
|
|
11
|
+
content: '';
|
|
12
|
+
flex-shrink: 0;
|
|
13
|
+
width: var(--rzero-combo-checkbox-size, 16px);
|
|
14
|
+
height: var(--rzero-combo-checkbox-size, 16px);
|
|
15
|
+
border: 2px solid var(--rzero-combo-checkbox-border, #d1d5db);
|
|
16
|
+
border-radius: var(--rzero-combo-checkbox-radius, 3px);
|
|
17
|
+
background: var(--rzero-combo-checkbox-bg, #ffffff);
|
|
18
|
+
transition: background 150ms ease, border-color 150ms ease;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.rzero-combo-item[data-variant="checkbox"][data-selected]::before {
|
|
22
|
+
background: var(--rzero-combo-checkbox-checked-bg, #3b82f6);
|
|
23
|
+
border-color: var(--rzero-combo-checkbox-checked-border, #3b82f6);
|
|
24
|
+
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='white'%3E%3Cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3E%3C/svg%3E");
|
|
25
|
+
background-size: 12px 12px;
|
|
26
|
+
background-position: center;
|
|
27
|
+
background-repeat: no-repeat;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.rzero-combo-item[data-variant="checkbox"][data-highlighted]::before {
|
|
31
|
+
border-color: var(--rzero-combo-checkbox-hover-border, #9ca3af);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.rzero-combo-item[data-variant="checkbox"][data-selected][data-highlighted]::before {
|
|
35
|
+
border-color: var(--rzero-combo-checkbox-checked-border, #3b82f6);
|
|
36
|
+
}
|