@getgreenline/blaze-ui 1.0.32 → 1.0.34
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/dist/components/header-app-switcher.d.ts +9 -2
- package/dist/components/header-app-switcher.d.ts.map +1 -1
- package/dist/components/header-app-switcher.js +23 -7
- package/dist/components/hierarchical-select.d.ts +22 -0
- package/dist/components/hierarchical-select.d.ts.map +1 -0
- package/dist/components/hierarchical-select.js +98 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/package.json +3 -3
|
@@ -36,6 +36,7 @@ declare const AppsConfig: readonly [{
|
|
|
36
36
|
readonly subdomain: null;
|
|
37
37
|
}];
|
|
38
38
|
type AppName = (typeof AppsConfig)[number]["name"];
|
|
39
|
+
type AppSubdomain = NonNullable<(typeof AppsConfig)[number]["subdomain"]>;
|
|
39
40
|
type HeaderAppSwitcherProps = {
|
|
40
41
|
/**
|
|
41
42
|
* Optional base host string (e.g. "https://blaze.me" or "staging.blaze.me").
|
|
@@ -44,7 +45,13 @@ type HeaderAppSwitcherProps = {
|
|
|
44
45
|
commonHost?: string;
|
|
45
46
|
/** Which app is currently active. Defaults to "Retail". */
|
|
46
47
|
currentApp?: AppName;
|
|
48
|
+
/** Filter apps by subdomain. When omitted, all apps are shown. */
|
|
49
|
+
visibleApps?: AppSubdomain[];
|
|
50
|
+
/** Number of grid columns. When omitted, auto-calculated from app count: 1–3 → 1 col, 4 → 2 cols, >4 → 3 cols. */
|
|
51
|
+
columns?: 1 | 2 | 3 | 4;
|
|
52
|
+
/** When true, appends ?sso=true to all app URLs to trigger SSO login on the target app. */
|
|
53
|
+
ssoRedirect?: boolean;
|
|
47
54
|
};
|
|
48
|
-
declare function HeaderAppSwitcher({ commonHost, currentApp, }: HeaderAppSwitcherProps): import("react/jsx-runtime").JSX.Element;
|
|
49
|
-
export { HeaderAppSwitcher, type HeaderAppSwitcherProps, type AppName };
|
|
55
|
+
declare function HeaderAppSwitcher({ commonHost, currentApp, visibleApps, columns, ssoRedirect, }: HeaderAppSwitcherProps): import("react/jsx-runtime").JSX.Element;
|
|
56
|
+
export { HeaderAppSwitcher, type HeaderAppSwitcherProps, type AppName, type AppSubdomain, };
|
|
50
57
|
//# sourceMappingURL=header-app-switcher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"header-app-switcher.d.ts","sourceRoot":"","sources":["../../src/components/header-app-switcher.tsx"],"names":[],"mappings":"AAqBA,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BN,CAAA;AAEV,KAAK,OAAO,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"header-app-switcher.d.ts","sourceRoot":"","sources":["../../src/components/header-app-switcher.tsx"],"names":[],"mappings":"AAqBA,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BN,CAAA;AAEV,KAAK,OAAO,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAA;AAClD,KAAK,YAAY,GAAG,WAAW,CAAC,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,CAAA;AAsHzE,KAAK,sBAAsB,GAAG;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,kEAAkE;IAClE,WAAW,CAAC,EAAE,YAAY,EAAE,CAAA;IAC5B,kHAAkH;IAClH,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACvB,2FAA2F;IAC3F,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,CAAA;AAuBD,iBAAS,iBAAiB,CAAC,EACzB,UAAU,EACV,UAAqB,EACrB,WAAW,EACX,OAAO,EACP,WAAW,GACZ,EAAE,sBAAsB,2CAoFxB;AAED,OAAO,EACL,iBAAiB,EACjB,KAAK,sBAAsB,EAC3B,KAAK,OAAO,EACZ,KAAK,YAAY,GAClB,CAAA"}
|
|
@@ -105,10 +105,13 @@ const resolveHostInfo = (commonHost) => {
|
|
|
105
105
|
host: "blaze.me",
|
|
106
106
|
};
|
|
107
107
|
};
|
|
108
|
-
const buildAppUrl = (subdomain, base) => {
|
|
108
|
+
const buildAppUrl = (subdomain, base, ssoRedirect) => {
|
|
109
109
|
if (!subdomain)
|
|
110
110
|
return "#";
|
|
111
|
-
|
|
111
|
+
const url = new URL(`${base.protocol}//${subdomain}.${base.host}`);
|
|
112
|
+
if (ssoRedirect)
|
|
113
|
+
url.searchParams.set("sso", "true");
|
|
114
|
+
return url.toString();
|
|
112
115
|
};
|
|
113
116
|
function AppsGridIcon() {
|
|
114
117
|
return (jsxs("svg", { "aria-hidden": true, viewBox: "0 0 24 24", fill: "currentColor", className: "tw:h-5 tw:w-5", children: [jsx("circle", { cx: "5", cy: "5", r: "1.5" }), jsx("circle", { cx: "12", cy: "5", r: "1.5" }), jsx("circle", { cx: "19", cy: "5", r: "1.5" }), jsx("circle", { cx: "5", cy: "12", r: "1.5" }), jsx("circle", { cx: "12", cy: "12", r: "1.5" }), jsx("circle", { cx: "19", cy: "12", r: "1.5" }), jsx("circle", { cx: "5", cy: "19", r: "1.5" }), jsx("circle", { cx: "12", cy: "19", r: "1.5" }), jsx("circle", { cx: "19", cy: "19", r: "1.5" })] }));
|
|
@@ -122,16 +125,29 @@ const getTileClassName = (isCurrent, isDisabled) => {
|
|
|
122
125
|
}
|
|
123
126
|
return "hover:tw:bg-accent tw:cursor-pointer";
|
|
124
127
|
};
|
|
125
|
-
|
|
128
|
+
const gridColsClass = {
|
|
129
|
+
1: "tw:grid-cols-1",
|
|
130
|
+
2: "tw:grid-cols-2",
|
|
131
|
+
3: "tw:grid-cols-3",
|
|
132
|
+
4: "tw:grid-cols-4",
|
|
133
|
+
};
|
|
134
|
+
function getAutoColumns(appCount) {
|
|
135
|
+
return Math.min(Math.ceil(Math.sqrt(appCount)), 4);
|
|
136
|
+
}
|
|
137
|
+
function HeaderAppSwitcher({ commonHost, currentApp = "Retail", visibleApps, columns, ssoRedirect, }) {
|
|
126
138
|
const apps = React.useMemo(() => {
|
|
127
139
|
const base = resolveHostInfo(commonHost);
|
|
128
|
-
|
|
140
|
+
const filtered = visibleApps
|
|
141
|
+
? AppsConfig.filter((app) => app.subdomain && visibleApps.includes(app.subdomain))
|
|
142
|
+
: AppsConfig;
|
|
143
|
+
return filtered.map((app) => ({
|
|
129
144
|
...app,
|
|
130
145
|
isCurrent: currentApp === app.name,
|
|
131
|
-
href: buildAppUrl(app.subdomain, base),
|
|
146
|
+
href: buildAppUrl(app.subdomain, base, ssoRedirect),
|
|
132
147
|
}));
|
|
133
|
-
}, [commonHost, currentApp]);
|
|
134
|
-
|
|
148
|
+
}, [commonHost, currentApp, visibleApps, ssoRedirect]);
|
|
149
|
+
const resolvedColumns = columns ?? getAutoColumns(apps.length);
|
|
150
|
+
return (jsxs(Popover, { children: [jsx(PopoverTrigger, { asChild: true, children: jsxs(Button, { variant: "ghost", size: "icon", children: [jsx(AppsGridIcon, {}), jsx("span", { className: "tw:sr-only", children: "Switch apps" })] }) }), jsxs(PopoverContent, { align: "end", sideOffset: 8, className: "tw:w-72 tw:p-4", children: [jsx("p", { className: "tw:mb-3 tw:text-sm tw:font-medium tw:text-muted-foreground", children: "Blaze Apps" }), jsx("div", { className: cn("tw:grid tw:gap-1", gridColsClass[resolvedColumns]), children: apps.map((app) => {
|
|
135
151
|
const isDisabled = Boolean(app.disabled);
|
|
136
152
|
const isCurrent = Boolean(app.isCurrent);
|
|
137
153
|
const tileClassName = getTileClassName(isCurrent, isDisabled);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
interface HierarchicalSelectItem {
|
|
3
|
+
id: string;
|
|
4
|
+
label: string;
|
|
5
|
+
parentId?: string | null;
|
|
6
|
+
}
|
|
7
|
+
interface HierarchicalSelectProps {
|
|
8
|
+
items: HierarchicalSelectItem[];
|
|
9
|
+
value?: string;
|
|
10
|
+
onValueChange?: (value: string) => void;
|
|
11
|
+
placeholder?: string;
|
|
12
|
+
searchPlaceholder?: string;
|
|
13
|
+
emptyMessage?: string;
|
|
14
|
+
className?: string;
|
|
15
|
+
triggerStyle?: React.CSSProperties;
|
|
16
|
+
disabled?: boolean;
|
|
17
|
+
label?: string;
|
|
18
|
+
}
|
|
19
|
+
declare function HierarchicalSelect({ items, value, onValueChange, placeholder, searchPlaceholder, emptyMessage, className, triggerStyle, disabled, label, }: HierarchicalSelectProps): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export { HierarchicalSelect };
|
|
21
|
+
export type { HierarchicalSelectItem, HierarchicalSelectProps };
|
|
22
|
+
//# sourceMappingURL=hierarchical-select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hierarchical-select.d.ts","sourceRoot":"","sources":["../../src/components/hierarchical-select.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAW9B,UAAU,sBAAsB;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAED,UAAU,uBAAuB;IAC/B,KAAK,EAAE,sBAAsB,EAAE,CAAA;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,KAAK,CAAC,aAAa,CAAA;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAuED,iBAAS,kBAAkB,CAAC,EAC1B,KAAK,EACL,KAAK,EACL,aAAa,EACb,WAAmC,EACnC,iBAA+B,EAC/B,YAAiC,EACjC,SAAS,EACT,YAAY,EACZ,QAAgB,EAChB,KAAK,GACN,EAAE,uBAAuB,2CA+QzB;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAA;AAC7B,YAAY,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,CAAA"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import * as PopoverPrimitive from '@radix-ui/react-popover';
|
|
4
|
+
import { ChevronDownIcon, SearchIcon, FolderTreeIcon, CheckIcon } from 'lucide-react';
|
|
5
|
+
import { cn } from '../lib/utils.js';
|
|
6
|
+
|
|
7
|
+
function buildHierarchy(items) {
|
|
8
|
+
const parents = items.filter((item) => !item.parentId);
|
|
9
|
+
const childrenMap = new Map();
|
|
10
|
+
for (const item of items) {
|
|
11
|
+
if (item.parentId) {
|
|
12
|
+
const existing = childrenMap.get(item.parentId) ?? [];
|
|
13
|
+
existing.push(item);
|
|
14
|
+
childrenMap.set(item.parentId, existing);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return parents.map((parent) => ({
|
|
18
|
+
parent,
|
|
19
|
+
children: childrenMap.get(parent.id) ?? [],
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
function filterHierarchy(groups, search) {
|
|
23
|
+
if (!search)
|
|
24
|
+
return groups;
|
|
25
|
+
const query = search.toLowerCase();
|
|
26
|
+
return groups.reduce((acc, group) => {
|
|
27
|
+
const parentMatches = group.parent.label.toLowerCase().includes(query);
|
|
28
|
+
if (parentMatches) {
|
|
29
|
+
acc.push(group);
|
|
30
|
+
return acc;
|
|
31
|
+
}
|
|
32
|
+
const matchingChildren = group.children.filter((child) => child.label.toLowerCase().includes(query));
|
|
33
|
+
if (matchingChildren.length > 0) {
|
|
34
|
+
acc.push({ parent: group.parent, children: matchingChildren });
|
|
35
|
+
}
|
|
36
|
+
return acc;
|
|
37
|
+
}, []);
|
|
38
|
+
}
|
|
39
|
+
function getDisplayValue(items, value) {
|
|
40
|
+
if (!value)
|
|
41
|
+
return undefined;
|
|
42
|
+
const selected = items.find((item) => item.id === value);
|
|
43
|
+
if (!selected)
|
|
44
|
+
return undefined;
|
|
45
|
+
if (selected.parentId) {
|
|
46
|
+
const parent = items.find((item) => item.id === selected.parentId);
|
|
47
|
+
return parent ? `${parent.label} > ${selected.label}` : selected.label;
|
|
48
|
+
}
|
|
49
|
+
return selected.label;
|
|
50
|
+
}
|
|
51
|
+
function countVisibleCategories(groups) {
|
|
52
|
+
return groups.reduce((count, group) => count + 1 + group.children.length, 0);
|
|
53
|
+
}
|
|
54
|
+
function HierarchicalSelect({ items, value, onValueChange, placeholder = "Select an option...", searchPlaceholder = "Search...", emptyMessage = "No results found", className, triggerStyle, disabled = false, label, }) {
|
|
55
|
+
const [open, setOpen] = React.useState(false);
|
|
56
|
+
const [search, setSearch] = React.useState("");
|
|
57
|
+
const searchInputRef = React.useRef(null);
|
|
58
|
+
const [portalContainer, setPortalContainer] = React.useState(null);
|
|
59
|
+
const listboxId = React.useId();
|
|
60
|
+
const searchId = React.useId();
|
|
61
|
+
React.useEffect(() => {
|
|
62
|
+
const el = document.createElement("div");
|
|
63
|
+
el.className = "blaze-ui-root";
|
|
64
|
+
document.body.appendChild(el);
|
|
65
|
+
setPortalContainer(el);
|
|
66
|
+
return () => {
|
|
67
|
+
document.body.removeChild(el);
|
|
68
|
+
};
|
|
69
|
+
}, []);
|
|
70
|
+
const hierarchy = React.useMemo(() => buildHierarchy(items), [items]);
|
|
71
|
+
const filtered = React.useMemo(() => filterHierarchy(hierarchy, search), [hierarchy, search]);
|
|
72
|
+
const displayValue = React.useMemo(() => getDisplayValue(items, value), [items, value]);
|
|
73
|
+
const visibleCount = React.useMemo(() => countVisibleCategories(filtered), [filtered]);
|
|
74
|
+
const handleOpenChange = React.useCallback((nextOpen) => {
|
|
75
|
+
setOpen(nextOpen);
|
|
76
|
+
if (!nextOpen) {
|
|
77
|
+
setSearch("");
|
|
78
|
+
}
|
|
79
|
+
}, []);
|
|
80
|
+
const handleSelect = React.useCallback((id) => {
|
|
81
|
+
onValueChange?.(id);
|
|
82
|
+
setOpen(false);
|
|
83
|
+
setSearch("");
|
|
84
|
+
}, [onValueChange]);
|
|
85
|
+
React.useEffect(() => {
|
|
86
|
+
if (open) {
|
|
87
|
+
const frame = requestAnimationFrame(() => {
|
|
88
|
+
searchInputRef.current?.focus();
|
|
89
|
+
});
|
|
90
|
+
return () => cancelAnimationFrame(frame);
|
|
91
|
+
}
|
|
92
|
+
}, [open]);
|
|
93
|
+
return (jsxs(PopoverPrimitive.Root, { open: open, onOpenChange: handleOpenChange, children: [jsxs(PopoverPrimitive.Trigger, { "data-slot": "hierarchical-select-trigger", disabled: disabled, role: "combobox", "aria-expanded": open, "aria-haspopup": "listbox", "aria-controls": listboxId, "aria-label": label ?? placeholder, className: cn("tw:!flex tw:!w-full tw:!items-center tw:!justify-between tw:!gap-2 tw:!rounded-md tw:!border tw:!border-input tw:!bg-transparent tw:px-3 tw:py-2 tw:!text-[14px] tw:!whitespace-nowrap tw:!shadow-xs tw:!transition-[color,box-shadow] tw:!outline-none tw:h-9", "focus-visible:tw:!border-ring focus-visible:tw:!ring-ring/50 focus-visible:tw:!ring-[3px]", "disabled:tw:!cursor-not-allowed disabled:tw:!opacity-50", "dark:tw:!bg-input/30 dark:hover:tw:!bg-input/50", !displayValue && "tw:!text-muted-foreground", className), style: triggerStyle, children: [jsx("span", { "data-slot": "hierarchical-select-value", className: "tw:!truncate tw:!flex-1 tw:!text-left", children: displayValue ?? placeholder }), jsx(ChevronDownIcon, { "data-slot": "hierarchical-select-chevron", "aria-hidden": true, className: cn("tw:!size-4 tw:!shrink-0 tw:!opacity-50 tw:!transition-transform tw:!duration-200", open && "tw:!rotate-180") })] }), jsx(PopoverPrimitive.Portal, { container: portalContainer, children: jsxs(PopoverPrimitive.Content, { "data-slot": "hierarchical-select-content", align: "start", sideOffset: 4, className: cn("tw:!bg-popover tw:!text-popover-foreground tw:!z-[9999] tw:!w-[var(--radix-popover-trigger-width)] tw:!origin-(--radix-popover-content-transform-origin) tw:!rounded-md tw:!border tw:!shadow-md tw:!outline-hidden", "data-[state=open]:tw:!animate-in data-[state=closed]:tw:!animate-out data-[state=closed]:tw:!fade-out-0 data-[state=open]:tw:!fade-in-0 data-[state=closed]:tw:!zoom-out-95 data-[state=open]:tw:!zoom-in-95", "data-[side=bottom]:tw:!slide-in-from-top-2 data-[side=left]:tw:!slide-in-from-right-2 data-[side=right]:tw:!slide-in-from-left-2 data-[side=top]:tw:!slide-in-from-bottom-2"), children: [jsxs("div", { "data-slot": "hierarchical-select-search", className: "tw:!flex tw:!items-center tw:!gap-2 tw:!border-b tw:!px-3 tw:!sticky tw:!top-0 tw:!bg-popover tw:!z-10", children: [jsx(SearchIcon, { className: "tw:!size-4 tw:!shrink-0 tw:!text-muted-foreground" }), jsx("input", { ref: searchInputRef, id: searchId, "data-slot": "hierarchical-select-search-input", type: "text", role: "searchbox", "aria-label": searchPlaceholder, "aria-autocomplete": "list", value: search, onChange: (e) => setSearch(e.target.value), placeholder: searchPlaceholder, className: "tw:!flex tw:!h-9 tw:!w-full tw:!bg-transparent tw:!py-2 tw:!text-[14px] tw:!outline-none placeholder:tw:!text-muted-foreground" })] }), jsx("div", { id: listboxId, "data-slot": "hierarchical-select-list", role: "listbox", "aria-label": label ?? placeholder, className: "tw:!max-h-[320px] tw:!overflow-y-auto tw:!overflow-x-hidden tw:!p-1", children: filtered.length === 0 ? (jsxs("div", { "data-slot": "hierarchical-select-empty", role: "status", "aria-live": "polite", className: "tw:!flex tw:!flex-col tw:!items-center tw:!justify-center tw:!gap-2 tw:!py-8 tw:!text-center", children: [jsx("div", { className: "tw:!flex tw:!size-10 tw:!items-center tw:!justify-center tw:!rounded-full tw:!bg-muted", children: jsx(SearchIcon, { "aria-hidden": true, className: "tw:!size-4 tw:!text-muted-foreground" }) }), jsx("div", { className: "tw:!text-[14px] tw:!font-medium", children: emptyMessage }), jsx("p", { className: "tw:!text-[12px] tw:!text-muted-foreground", children: "Try adjusting your search query" })] })) : (filtered.map((group) => (jsxs("div", { "data-slot": "hierarchical-select-group", role: "group", "aria-label": group.parent.label, className: "tw:!mb-1", children: [jsxs("button", { type: "button", "data-slot": "hierarchical-select-parent", role: "option", "aria-selected": value === group.parent.id, onClick: () => handleSelect(group.parent.id), className: cn("tw:!relative tw:!flex tw:!w-full tw:!cursor-default tw:!items-center tw:!gap-2 tw:!rounded-sm tw:!px-2 tw:!py-1.5 tw:!text-[14px] tw:!font-semibold tw:!outline-hidden tw:!select-none tw:!transition-colors", "hover:tw:!bg-accent hover:tw:!text-accent-foreground", value === group.parent.id &&
|
|
94
|
+
"tw:!bg-accent tw:!text-accent-foreground"), children: [jsx(FolderTreeIcon, { "aria-hidden": true, className: "tw:!size-4 tw:!shrink-0 tw:!text-muted-foreground" }), jsx("span", { className: "tw:!flex-1 tw:!text-left tw:!truncate", children: group.parent.label }), group.children.length > 0 && (jsx("span", { "data-slot": "hierarchical-select-badge", className: "tw:!inline-flex tw:!items-center tw:!justify-center tw:!rounded-full tw:!bg-muted tw:!px-1.5 tw:!py-0.5 tw:!text-[10px] tw:!font-medium tw:!text-muted-foreground tw:!leading-none", children: group.children.length })), value === group.parent.id && (jsx(CheckIcon, { "aria-hidden": true, className: "tw:!size-4 tw:!shrink-0" }))] }), group.children.length > 0 && (jsx("div", { "data-slot": "hierarchical-select-children", role: "group", "aria-label": `${group.parent.label} subcategories`, className: "tw:!ml-4 tw:!border-l tw:!border-border tw:!pl-2", children: group.children.map((child) => (jsxs("button", { type: "button", "data-slot": "hierarchical-select-child", role: "option", "aria-selected": value === child.id, onClick: () => handleSelect(child.id), className: cn("tw:!relative tw:!flex tw:!w-full tw:!cursor-default tw:!items-center tw:!gap-2 tw:!rounded-sm tw:!px-2 tw:!py-1.5 tw:!text-[14px] tw:!outline-hidden tw:!select-none tw:!transition-colors", "hover:tw:!bg-accent hover:tw:!text-accent-foreground", "tw:!text-muted-foreground", value === child.id &&
|
|
95
|
+
"tw:!bg-accent tw:!text-accent-foreground"), children: [jsx("span", { "aria-hidden": true, className: "tw:!size-1.5 tw:!rounded-full tw:!bg-muted-foreground/50 tw:!shrink-0" }), jsx("span", { className: "tw:!flex-1 tw:!text-left tw:!truncate", children: child.label }), value === child.id && (jsx(CheckIcon, { "aria-hidden": true, className: "tw:!size-4 tw:!shrink-0" }))] }, child.id))) }))] }, group.parent.id)))) }), jsx("div", { "data-slot": "hierarchical-select-footer", "aria-live": "polite", "aria-atomic": "true", className: "tw:!border-t tw:!px-3 tw:!py-2 tw:!text-[12px] tw:!text-muted-foreground", children: search ? (jsxs("span", { children: [visibleCount, " result", visibleCount !== 1 ? "s" : "", " for \u201C", search, "\u201D"] })) : (jsxs("span", { children: [visibleCount, " categor", visibleCount !== 1 ? "ies" : "y"] })) })] }) })] }));
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export { HierarchicalSelect };
|
package/dist/index.d.ts
CHANGED
|
@@ -59,5 +59,6 @@ export * from "./components/input-group";
|
|
|
59
59
|
export * from "./components/sidebar";
|
|
60
60
|
export * from "./components/header-app-switcher";
|
|
61
61
|
export * from "./lib/portal-wrapper";
|
|
62
|
+
export * from "./components/hierarchical-select";
|
|
62
63
|
export * from "./lib/utils";
|
|
63
64
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,2BAA2B,CAAA;AACzC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,uBAAuB,CAAA;AACrC,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,0BAA0B,CAAA;AACxC,cAAc,0BAA0B,CAAA;AACxC,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,wBAAwB,CAAA;AACtC,cAAc,oBAAoB,CAAA;AAClC,cAAc,2BAA2B,CAAA;AACzC,cAAc,qBAAqB,CAAA;AACnC,cAAc,yBAAyB,CAAA;AACvC,cAAc,0BAA0B,CAAA;AACxC,cAAc,2BAA2B,CAAA;AACzC,cAAc,qBAAqB,CAAA;AACnC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,oBAAoB,CAAA;AAClC,cAAc,yBAAyB,CAAA;AACvC,cAAc,wBAAwB,CAAA;AACtC,cAAc,kBAAkB,CAAA;AAChC,cAAc,sBAAsB,CAAA;AACpC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AACtC,cAAc,yBAAyB,CAAA;AACvC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,yBAAyB,CAAA;AACvC,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,2BAA2B,CAAA;AACzC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA;AACpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,0BAA0B,CAAA;AACxC,cAAc,sBAAsB,CAAA;AACpC,cAAc,kCAAkC,CAAA;AAChD,cAAc,sBAAsB,CAAA;AACpC,cAAc,aAAa,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,2BAA2B,CAAA;AACzC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,uBAAuB,CAAA;AACrC,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA;AACpC,cAAc,qBAAqB,CAAA;AACnC,cAAc,0BAA0B,CAAA;AACxC,cAAc,0BAA0B,CAAA;AACxC,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,gCAAgC,CAAA;AAC9C,cAAc,wBAAwB,CAAA;AACtC,cAAc,oBAAoB,CAAA;AAClC,cAAc,2BAA2B,CAAA;AACzC,cAAc,qBAAqB,CAAA;AACnC,cAAc,yBAAyB,CAAA;AACvC,cAAc,0BAA0B,CAAA;AACxC,cAAc,2BAA2B,CAAA;AACzC,cAAc,qBAAqB,CAAA;AACnC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,oBAAoB,CAAA;AAClC,cAAc,yBAAyB,CAAA;AACvC,cAAc,wBAAwB,CAAA;AACtC,cAAc,kBAAkB,CAAA;AAChC,cAAc,sBAAsB,CAAA;AACpC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AACtC,cAAc,yBAAyB,CAAA;AACvC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,yBAAyB,CAAA;AACvC,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,2BAA2B,CAAA;AACzC,cAAc,8BAA8B,CAAA;AAC5C,cAAc,oBAAoB,CAAA;AAClC,cAAc,sBAAsB,CAAA;AACpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,2BAA2B,CAAA;AACzC,cAAc,2BAA2B,CAAA;AACzC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,oBAAoB,CAAA;AAClC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,0BAA0B,CAAA;AACxC,cAAc,sBAAsB,CAAA;AACpC,cAAc,kCAAkC,CAAA;AAChD,cAAc,sBAAsB,CAAA;AACpC,cAAc,kCAAkC,CAAA;AAChD,cAAc,aAAa,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -59,5 +59,6 @@ export { InputGroup, InputGroupAddon, InputGroupButton, InputGroupInput, InputGr
|
|
|
59
59
|
export { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInput, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, useSidebar } from './components/sidebar.js';
|
|
60
60
|
export { HeaderAppSwitcher } from './components/header-app-switcher.js';
|
|
61
61
|
export { PortalWrapper } from './lib/portal-wrapper.js';
|
|
62
|
+
export { HierarchicalSelect } from './components/hierarchical-select.js';
|
|
62
63
|
export { cn } from './lib/utils.js';
|
|
63
64
|
export { CheckIcon, XIcon } from 'lucide-react';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@getgreenline/blaze-ui",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.34",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@base-ui/react": "^1.1.0",
|
|
@@ -64,8 +64,8 @@
|
|
|
64
64
|
"rollup": "^4.52.0",
|
|
65
65
|
"tailwindcss": "^4.1.11",
|
|
66
66
|
"typescript": "^5.9.2",
|
|
67
|
-
"@workspace/
|
|
68
|
-
"@workspace/
|
|
67
|
+
"@workspace/typescript-config": "0.0.0",
|
|
68
|
+
"@workspace/eslint-config": "0.0.0"
|
|
69
69
|
},
|
|
70
70
|
"main": "./dist/index.js",
|
|
71
71
|
"module": "./dist/index.js",
|