@giddaa-housing/ui 3.4.0 → 3.6.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/css/components.css +13 -0
- package/css/generated/shared.css +1 -1
- package/dist/accordion.js +1 -1
- package/dist/activity-timeline.js +1 -1
- package/dist/alert.js +1 -1
- package/dist/auth-layout.js +1 -1
- package/dist/avatar.js +1 -1
- package/dist/badge.d.ts +5 -1
- package/dist/badge.js +20 -6
- package/dist/bar-chart.d.ts +1 -1
- package/dist/bar-chart.js +1 -1
- package/dist/breadcrumb.js +1 -1
- package/dist/bullet-chart.d.ts +1 -1
- package/dist/bullet-chart.js +1 -1
- package/dist/button-BS5KCibF.d.ts +33 -0
- package/dist/button-group.d.ts +1 -1
- package/dist/button-group.js +1 -1
- package/dist/button.d.ts +1 -1
- package/dist/button.js +50 -22
- package/dist/calendar.js +2 -2
- package/dist/call-card.js +1 -1
- package/dist/card.js +1 -1
- package/dist/carousel.d.ts +4 -2
- package/dist/carousel.js +13 -16
- package/dist/chart.d.ts +1 -1
- package/dist/chart.js +1 -1
- package/dist/chat.d.ts +1 -1
- package/dist/chat.js +1 -1
- package/dist/checkbox.d.ts +2 -2
- package/dist/checkbox.js +21 -7
- package/dist/collapsible.js +1 -1
- package/dist/combobox-CACVdp1R.js +430 -0
- package/dist/combobox.d.ts +9 -4
- package/dist/combobox.js +2 -309
- package/dist/cta.d.ts +1 -1
- package/dist/cta.js +1 -1
- package/dist/currency-selector.js +2 -2
- package/dist/data-table.d.ts +2 -2
- package/dist/data-table.js +1 -1
- package/dist/date-picker.d.ts +6 -5
- package/dist/date-picker.js +7 -17
- package/dist/details-card.js +1 -1
- package/dist/dialog.d.ts +3 -1
- package/dist/dialog.js +10 -6
- package/dist/dropdown-menu.d.ts +1 -1
- package/dist/dropdown-menu.js +1 -1
- package/dist/dropzone.js +1 -1
- package/dist/editorial-card.js +2 -4
- package/dist/empty-state.js +1 -1
- package/dist/field.d.ts +4 -1
- package/dist/field.js +29 -12
- package/dist/file-upload.js +1 -1
- package/dist/filter.js +1 -1
- package/dist/footer.d.ts +2 -2
- package/dist/footer.js +1 -1
- package/dist/funnel-chart.d.ts +1 -1
- package/dist/funnel-chart.js +1 -1
- package/dist/gallery-indicator.js +1 -1
- package/dist/heatmap-chart.d.ts +1 -1
- package/dist/icons-C9JXR5Xv.d.ts +111 -0
- package/dist/icons.d.ts +2 -93
- package/dist/icons.js +37 -1
- package/dist/image.d.ts +59 -0
- package/dist/image.js +53 -0
- package/dist/infinite-scroll.js +3 -29
- package/dist/infotip.js +1 -1
- package/dist/input-group.d.ts +6 -6
- package/dist/input-group.js +39 -14
- package/dist/input-otp.d.ts +2 -2
- package/dist/input-otp.js +32 -15
- package/dist/input-size-context-BMhves-J.d.ts +13 -0
- package/dist/input-size-context.d.ts +2 -2
- package/dist/input-size-context.js +9 -2
- package/dist/input.d.ts +20 -2
- package/dist/input.js +31 -12
- package/dist/item.js +1 -1
- package/dist/kpi-card.js +1 -1
- package/dist/label.js +1 -1
- package/dist/line-chart.d.ts +1 -1
- package/dist/line-chart.js +1 -1
- package/dist/list-item.js +1 -1
- package/dist/map-indicator.js +1 -1
- package/dist/mask-input.d.ts +1 -1
- package/dist/match.d.ts +5 -2
- package/dist/match.js +183 -27
- package/dist/media-gallery-hero.js +15 -10
- package/dist/media-player.js +5 -13
- package/dist/message.js +2 -12
- package/dist/mobile-sidebar.js +2 -1
- package/dist/multi-step-form.js +2 -2
- package/dist/number-input.d.ts +2 -2
- package/dist/number-input.js +3 -3
- package/dist/page-header.js +1 -1
- package/dist/pagination.d.ts +1 -1
- package/dist/pagination.js +1 -1
- package/dist/password-input.js +1 -1
- package/dist/phone-input.d.ts +2 -2
- package/dist/phone-input.js +16 -21
- package/dist/photo-gallery.js +6 -3
- package/dist/picker-BTXBrsl4.js +62 -0
- package/dist/picker-j3txxA5t.d.ts +14 -0
- package/dist/pie-chart.d.ts +1 -1
- package/dist/pie-chart.js +1 -1
- package/dist/popover-CNymD33m.d.ts +20 -0
- package/dist/popover.d.ts +1 -19
- package/dist/popover.js +1 -1
- package/dist/price-tag.d.ts +1 -1
- package/dist/price-tag.js +50 -22
- package/dist/progress.js +1 -1
- package/dist/property-listing-card.d.ts +68 -2
- package/dist/property-listing-card.js +115 -29
- package/dist/purchase-option-card.js +1 -1
- package/dist/radar-chart.d.ts +1 -1
- package/dist/radar-chart.js +1 -1
- package/dist/radio-group.d.ts +2 -2
- package/dist/radio-group.js +24 -10
- package/dist/review-block.js +1 -1
- package/dist/rich-text-editor.d.ts +1 -1
- package/dist/rich-text-editor.js +1 -1
- package/dist/scatter-chart.d.ts +1 -1
- package/dist/scatter-chart.js +1 -1
- package/dist/scroll-spy.d.ts +8 -2
- package/dist/scroll-spy.js +16 -16
- package/dist/search-input.js +1 -1
- package/dist/section-jumper.d.ts +31 -0
- package/dist/section-jumper.js +276 -0
- package/dist/select.d.ts +9 -4
- package/dist/select.js +113 -20
- package/dist/separator.js +1 -1
- package/dist/sheet.d.ts +3 -1
- package/dist/sheet.js +10 -6
- package/dist/sidebar.d.ts +2 -2
- package/dist/sidebar.js +4 -16
- package/dist/size-context-BVhHduLi.d.ts +33 -0
- package/dist/size-context.d.ts +2 -2
- package/dist/size-context.js +30 -1
- package/dist/skeleton.js +1 -1
- package/dist/slider.d.ts +5 -3
- package/dist/slider.js +26 -11
- package/dist/sonar.d.ts +1 -1
- package/dist/sonar.js +2 -2
- package/dist/sparkline.d.ts +1 -1
- package/dist/sparkline.js +1 -1
- package/dist/stepper.js +1 -1
- package/dist/styles.css +1622 -264
- package/dist/switch.d.ts +2 -2
- package/dist/switch.js +21 -7
- package/dist/table-card.js +1 -1
- package/dist/table.js +1 -1
- package/dist/tabs.d.ts +1 -1
- package/dist/tabs.js +1 -1
- package/dist/tag.d.ts +1 -1
- package/dist/tag.js +1 -1
- package/dist/testimonial-block.js +1 -1
- package/dist/textarea.d.ts +17 -1
- package/dist/textarea.js +24 -10
- package/dist/theme-switcher.js +1 -1
- package/dist/time-picker.d.ts +5 -4
- package/dist/time-picker.js +5 -7
- package/dist/toast.js +1 -1
- package/dist/tooltip.js +1 -1
- package/dist/top-navbar.js +1 -1
- package/dist/tree-map.d.ts +1 -1
- package/dist/tree-map.js +1 -1
- package/dist/utils/cn.d.ts +5 -0
- package/dist/utils/cn.js +33 -0
- package/dist/utils/format.d.ts +45 -0
- package/dist/utils/format.js +70 -0
- package/dist/utils/phone.d.ts +98 -0
- package/dist/utils/phone.js +93 -0
- package/dist/utils/use-intersection.d.ts +9 -0
- package/dist/utils/use-intersection.js +29 -0
- package/dist/utils/use-is-mobile.d.ts +5 -0
- package/dist/utils/use-is-mobile.js +16 -0
- package/dist/utils/use-reduced-motion.d.ts +5 -0
- package/dist/{use-reduced-motion-BDvOK14x.js → utils/use-reduced-motion.js} +2 -2
- package/dist/utils/use-uncontrolled.d.ts +11 -0
- package/dist/{use-uncontrolled-CLfM1XbB.js → utils/use-uncontrolled.js} +2 -2
- package/dist/video-player-dialog.d.ts +12 -2
- package/dist/video-player-dialog.js +50 -9
- package/dist/waterfall-chart.d.ts +1 -1
- package/dist/waterfall-chart.js +1 -1
- package/package.json +13 -1
- package/dist/button-DW5OijoR.d.ts +0 -17
- package/dist/cn-BI_4DMBf.js +0 -23
- package/dist/input-CfoEJ8A6.d.ts +0 -12
- package/dist/input-size-context-C-SFx9sx.d.ts +0 -10
- package/dist/picker-xSTzeYhc.js +0 -50
- package/dist/size-context-BX6kAdVj.d.ts +0 -11
- package/dist/textarea-IS_D8pXf.d.ts +0 -11
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
//#region src/section-jumper.d.ts
|
|
3
|
+
type SectionJumperItem = {
|
|
4
|
+
value: string;
|
|
5
|
+
label: React.ReactNode;
|
|
6
|
+
/** DOM id of a standalone destination. Defaults to `value`. */
|
|
7
|
+
targetId?: string;
|
|
8
|
+
};
|
|
9
|
+
type SectionJumperProviderProps = React.ComponentProps<"div"> & {
|
|
10
|
+
/** Heading selectors to discover inside the provider. */
|
|
11
|
+
selectors?: string[];
|
|
12
|
+
/** Prefix used for IDs generated on headings that do not already have one. */
|
|
13
|
+
idPrefix?: string;
|
|
14
|
+
/** Sticky-header offset used when tracking and scrolling to headings. */
|
|
15
|
+
scrollOffset?: number;
|
|
16
|
+
};
|
|
17
|
+
declare function SectionJumperProvider({ children, selectors, idPrefix, scrollOffset, ...props }: SectionJumperProviderProps): React.JSX.Element;
|
|
18
|
+
type SectionJumperProps = Omit<React.ComponentProps<"div">, "children"> & {
|
|
19
|
+
/** Explicit sections. Omit inside `SectionJumperProvider` to use discovered headings. */
|
|
20
|
+
items?: SectionJumperItem[];
|
|
21
|
+
label?: string;
|
|
22
|
+
open?: boolean;
|
|
23
|
+
defaultOpen?: boolean;
|
|
24
|
+
onOpenChange?: (open: boolean) => void;
|
|
25
|
+
mobileBreakpoint?: number;
|
|
26
|
+
/** Sticky-header offset used by standalone target-id mode. */
|
|
27
|
+
scrollOffset?: number;
|
|
28
|
+
};
|
|
29
|
+
declare function SectionJumper({ className, items: itemsProp, label, open, defaultOpen, onOpenChange, mobileBreakpoint, scrollOffset: scrollOffsetProp, ...props }: SectionJumperProps): React.JSX.Element | null;
|
|
30
|
+
//#endregion
|
|
31
|
+
export { SectionJumper, type SectionJumperItem, type SectionJumperProps, SectionJumperProvider, type SectionJumperProviderProps };
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { ChevronDown } from "./icons.js";
|
|
3
|
+
import { cn } from "./utils/cn.js";
|
|
4
|
+
import { useReducedMotion } from "./utils/use-reduced-motion.js";
|
|
5
|
+
import { Popover, PopoverContent, PopoverTrigger } from "./popover.js";
|
|
6
|
+
import { useOptionalScrollSpy } from "./scroll-spy.js";
|
|
7
|
+
import { useIsMobile } from "./utils/use-is-mobile.js";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
import * as React from "react";
|
|
10
|
+
//#region src/section-jumper.tsx
|
|
11
|
+
const SectionJumperProviderContext = React.createContext(null);
|
|
12
|
+
function SectionJumperProvider({ children, selectors = ["h2"], idPrefix = "section-jumper-heading", scrollOffset = 0, ...props }) {
|
|
13
|
+
const rootRef = React.useRef(null);
|
|
14
|
+
const [items, setItems] = React.useState([]);
|
|
15
|
+
const selector = selectors.join(",");
|
|
16
|
+
React.useEffect(() => {
|
|
17
|
+
const root = rootRef.current;
|
|
18
|
+
if (!root || !selector) return;
|
|
19
|
+
const generatedIds = /* @__PURE__ */ new Set();
|
|
20
|
+
const discover = () => {
|
|
21
|
+
const usedIds = /* @__PURE__ */ new Set();
|
|
22
|
+
const next = [...root.querySelectorAll(selector)].reduce((result, heading, index) => {
|
|
23
|
+
const label = heading.textContent?.trim();
|
|
24
|
+
if (!label) return result;
|
|
25
|
+
let targetId = heading.id;
|
|
26
|
+
if (!targetId) {
|
|
27
|
+
targetId = `${idPrefix}-${index + 1}`;
|
|
28
|
+
let suffix = 2;
|
|
29
|
+
while (usedIds.has(targetId) || document.getElementById(targetId) && document.getElementById(targetId) !== heading) targetId = `${idPrefix}-${index + 1}-${suffix++}`;
|
|
30
|
+
heading.id = targetId;
|
|
31
|
+
generatedIds.add(targetId);
|
|
32
|
+
}
|
|
33
|
+
usedIds.add(targetId);
|
|
34
|
+
result.push({
|
|
35
|
+
value: targetId,
|
|
36
|
+
label,
|
|
37
|
+
targetId
|
|
38
|
+
});
|
|
39
|
+
return result;
|
|
40
|
+
}, []);
|
|
41
|
+
setItems((current) => current.length === next.length && current.every((item, index) => item.value === next[index]?.value && item.label === next[index]?.label) ? current : next);
|
|
42
|
+
};
|
|
43
|
+
discover();
|
|
44
|
+
const observer = new MutationObserver(discover);
|
|
45
|
+
observer.observe(root, {
|
|
46
|
+
childList: true,
|
|
47
|
+
subtree: true,
|
|
48
|
+
characterData: true
|
|
49
|
+
});
|
|
50
|
+
return () => {
|
|
51
|
+
observer.disconnect();
|
|
52
|
+
for (const id of generatedIds) {
|
|
53
|
+
const heading = document.getElementById(id);
|
|
54
|
+
if (heading && root.contains(heading)) heading.removeAttribute("id");
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}, [idPrefix, selector]);
|
|
58
|
+
const value = React.useMemo(() => ({
|
|
59
|
+
items,
|
|
60
|
+
scrollOffset
|
|
61
|
+
}), [items, scrollOffset]);
|
|
62
|
+
return /* @__PURE__ */ jsx(SectionJumperProviderContext.Provider, {
|
|
63
|
+
value,
|
|
64
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
65
|
+
ref: rootRef,
|
|
66
|
+
"data-slot": "section-jumper-provider",
|
|
67
|
+
...props,
|
|
68
|
+
children
|
|
69
|
+
})
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
function getSectionJumperScrollport(element) {
|
|
73
|
+
let parent = element.parentElement;
|
|
74
|
+
while (parent && parent !== document.documentElement) {
|
|
75
|
+
const { overflowY } = getComputedStyle(parent);
|
|
76
|
+
if (overflowY === "auto" || overflowY === "scroll") return parent;
|
|
77
|
+
parent = parent.parentElement;
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
function useStandaloneSectionJumper(items, scrollOffset, enabled) {
|
|
82
|
+
const reducedMotion = useReducedMotion();
|
|
83
|
+
const [activeValue, setActiveValue] = React.useState(items[0]?.value);
|
|
84
|
+
const itemsRef = React.useRef(items);
|
|
85
|
+
itemsRef.current = items;
|
|
86
|
+
const targetKey = items.map((item) => `${item.value}:${item.targetId ?? item.value}`).join("|");
|
|
87
|
+
React.useEffect(() => {
|
|
88
|
+
if (!enabled) return;
|
|
89
|
+
let frame = 0;
|
|
90
|
+
const measure = () => {
|
|
91
|
+
frame = 0;
|
|
92
|
+
const targets = itemsRef.current.map((item) => ({
|
|
93
|
+
value: item.value,
|
|
94
|
+
element: document.getElementById(item.targetId ?? item.value)
|
|
95
|
+
})).filter((target) => Boolean(target.element));
|
|
96
|
+
if (targets.length === 0) return;
|
|
97
|
+
const scrollport = getSectionJumperScrollport(targets[0].element);
|
|
98
|
+
const originTop = scrollport?.getBoundingClientRect().top ?? 0;
|
|
99
|
+
let next = targets[0]?.value;
|
|
100
|
+
for (const target of targets) if (target.element.getBoundingClientRect().top - originTop <= scrollOffset + 2) next = target.value;
|
|
101
|
+
const root = scrollport ?? document.scrollingElement;
|
|
102
|
+
if (root && root.scrollTop + root.clientHeight >= root.scrollHeight - 2) next = targets.at(-1)?.value ?? next;
|
|
103
|
+
setActiveValue(next);
|
|
104
|
+
};
|
|
105
|
+
const scheduleMeasure = () => {
|
|
106
|
+
if (!frame) frame = requestAnimationFrame(measure);
|
|
107
|
+
};
|
|
108
|
+
const firstTarget = itemsRef.current.map((item) => document.getElementById(item.targetId ?? item.value)).find((element) => Boolean(element));
|
|
109
|
+
const scrollTarget = (firstTarget ? getSectionJumperScrollport(firstTarget) : null) ?? window;
|
|
110
|
+
measure();
|
|
111
|
+
scrollTarget.addEventListener("scroll", scheduleMeasure, { passive: true });
|
|
112
|
+
window.addEventListener("resize", scheduleMeasure);
|
|
113
|
+
return () => {
|
|
114
|
+
if (frame) cancelAnimationFrame(frame);
|
|
115
|
+
scrollTarget.removeEventListener("scroll", scheduleMeasure);
|
|
116
|
+
window.removeEventListener("resize", scheduleMeasure);
|
|
117
|
+
};
|
|
118
|
+
}, [
|
|
119
|
+
enabled,
|
|
120
|
+
scrollOffset,
|
|
121
|
+
targetKey
|
|
122
|
+
]);
|
|
123
|
+
const getTargetId = React.useCallback((value) => {
|
|
124
|
+
return itemsRef.current.find((candidate) => candidate.value === value)?.targetId ?? value;
|
|
125
|
+
}, []);
|
|
126
|
+
const scrollToSection = React.useCallback((value) => {
|
|
127
|
+
const element = document.getElementById(getTargetId(value));
|
|
128
|
+
if (!element) return;
|
|
129
|
+
setActiveValue(value);
|
|
130
|
+
const scrollport = getSectionJumperScrollport(element);
|
|
131
|
+
const behavior = reducedMotion ? "auto" : "smooth";
|
|
132
|
+
if (scrollport) scrollport.scrollTo({
|
|
133
|
+
top: element.getBoundingClientRect().top - scrollport.getBoundingClientRect().top + scrollport.scrollTop - scrollOffset,
|
|
134
|
+
behavior
|
|
135
|
+
});
|
|
136
|
+
else window.scrollTo({
|
|
137
|
+
top: element.getBoundingClientRect().top + window.scrollY - scrollOffset,
|
|
138
|
+
behavior
|
|
139
|
+
});
|
|
140
|
+
}, [
|
|
141
|
+
getTargetId,
|
|
142
|
+
reducedMotion,
|
|
143
|
+
scrollOffset
|
|
144
|
+
]);
|
|
145
|
+
return React.useMemo(() => ({
|
|
146
|
+
activeValue,
|
|
147
|
+
getSectionId: getTargetId,
|
|
148
|
+
getTriggerId: (value) => `section-jumper-${value}`,
|
|
149
|
+
scrollToSection
|
|
150
|
+
}), [
|
|
151
|
+
activeValue,
|
|
152
|
+
getTargetId,
|
|
153
|
+
scrollToSection
|
|
154
|
+
]);
|
|
155
|
+
}
|
|
156
|
+
function SectionJumperDot({ active, variant }) {
|
|
157
|
+
return /* @__PURE__ */ jsx("span", {
|
|
158
|
+
"aria-hidden": "true",
|
|
159
|
+
className: cn("block shrink-0 bg-line transition-[width,height,background-color] duration-(--duration-motion-surface) ease-gdt-out motion-reduce:transition-none", !active && "size-2 rounded-full", active && variant === "desktop" && "h-6 w-2 rounded-sm bg-surface-brand", active && variant === "menu" && "size-2 rounded-full bg-surface-brand", active && variant === "mobile" && "h-2 w-6 rounded-sm bg-surface-brand")
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
function SectionJumperMenu({ items, onSelect, controller }) {
|
|
163
|
+
const { activeValue, getSectionId, getTriggerId } = controller;
|
|
164
|
+
return /* @__PURE__ */ jsx("nav", {
|
|
165
|
+
"aria-label": "Page sections",
|
|
166
|
+
className: "flex flex-col gap-0.5",
|
|
167
|
+
children: items.map((item) => {
|
|
168
|
+
const active = item.value === activeValue;
|
|
169
|
+
return /* @__PURE__ */ jsxs("button", {
|
|
170
|
+
id: `${getTriggerId(item.value)}-jumper`,
|
|
171
|
+
type: "button",
|
|
172
|
+
"aria-controls": getSectionId(item.value),
|
|
173
|
+
"aria-current": active ? "location" : void 0,
|
|
174
|
+
"data-active": active ? "" : void 0,
|
|
175
|
+
className: cn("flex w-full cursor-pointer items-center gap-2.5 rounded-lg px-2.5 py-2 text-left text-gdt-sm font-medium text-fg-secondary outline-none transition-colors hover:bg-surface-raised focus-visible:shadow-[0_0_0_2px_var(--color-line-focus)]", active && "bg-surface-brand-subtle font-semibold text-fg-brand"),
|
|
176
|
+
onClick: () => onSelect(item.value),
|
|
177
|
+
children: [/* @__PURE__ */ jsx(SectionJumperDot, {
|
|
178
|
+
active,
|
|
179
|
+
variant: "menu"
|
|
180
|
+
}), /* @__PURE__ */ jsx("span", {
|
|
181
|
+
className: "min-w-0 flex-1 truncate",
|
|
182
|
+
children: item.label
|
|
183
|
+
})]
|
|
184
|
+
}, item.value);
|
|
185
|
+
})
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
function SectionJumper({ className, items: itemsProp, label = "On this page", open, defaultOpen = false, onOpenChange, mobileBreakpoint = 1024, scrollOffset: scrollOffsetProp, ...props }) {
|
|
189
|
+
const provider = React.useContext(SectionJumperProviderContext);
|
|
190
|
+
const items = itemsProp ?? provider?.items ?? [];
|
|
191
|
+
const scrollOffset = scrollOffsetProp ?? provider?.scrollOffset ?? 0;
|
|
192
|
+
const scrollSpy = useOptionalScrollSpy();
|
|
193
|
+
const hasExplicitTargets = items.some((item) => item.targetId !== void 0);
|
|
194
|
+
const standalone = useStandaloneSectionJumper(items, scrollOffset, hasExplicitTargets || !scrollSpy);
|
|
195
|
+
const controller = hasExplicitTargets || !scrollSpy ? standalone : scrollSpy;
|
|
196
|
+
const { activeValue, scrollToSection } = controller;
|
|
197
|
+
const isMobile = useIsMobile(mobileBreakpoint);
|
|
198
|
+
const [internalOpen, setInternalOpen] = React.useState(defaultOpen);
|
|
199
|
+
const resolvedOpen = open ?? internalOpen;
|
|
200
|
+
const activeItem = items.find((item) => item.value === activeValue);
|
|
201
|
+
const setOpen = React.useCallback((next) => {
|
|
202
|
+
if (open === void 0) setInternalOpen(next);
|
|
203
|
+
onOpenChange?.(next);
|
|
204
|
+
}, [onOpenChange, open]);
|
|
205
|
+
const select = React.useCallback((value) => {
|
|
206
|
+
scrollToSection(value);
|
|
207
|
+
setOpen(false);
|
|
208
|
+
}, [scrollToSection, setOpen]);
|
|
209
|
+
if (items.length === 0) return null;
|
|
210
|
+
const desktopTrigger = /* @__PURE__ */ jsx("button", {
|
|
211
|
+
type: "button",
|
|
212
|
+
"aria-label": `${label}${activeItem ? `, current section: ${String(activeItem.label)}` : ""}`,
|
|
213
|
+
className: "flex w-fit cursor-pointer flex-col items-center gap-3.5 rounded-2xl border border-transparent p-2 outline-none focus-visible:shadow-[0_0_0_2px_var(--color-line-focus)]",
|
|
214
|
+
children: items.map((item) => {
|
|
215
|
+
return /* @__PURE__ */ jsx(SectionJumperDot, {
|
|
216
|
+
active: item.value === activeValue,
|
|
217
|
+
variant: "desktop"
|
|
218
|
+
}, item.value);
|
|
219
|
+
})
|
|
220
|
+
});
|
|
221
|
+
const mobileTrigger = /* @__PURE__ */ jsxs("button", {
|
|
222
|
+
type: "button",
|
|
223
|
+
className: "flex cursor-pointer items-center gap-3 rounded-full border border-line-subtle bg-surface-overlay px-4 py-1 text-gdt-xs font-medium text-fg-brand shadow-2 outline-none focus-visible:shadow-[0_0_0_2px_var(--color-line-focus)]",
|
|
224
|
+
children: [
|
|
225
|
+
/* @__PURE__ */ jsx("span", {
|
|
226
|
+
"aria-hidden": true,
|
|
227
|
+
className: "flex items-center gap-1",
|
|
228
|
+
children: items.map((item) => /* @__PURE__ */ jsx(SectionJumperDot, {
|
|
229
|
+
active: item.value === activeValue,
|
|
230
|
+
variant: "mobile"
|
|
231
|
+
}, item.value))
|
|
232
|
+
}),
|
|
233
|
+
/* @__PURE__ */ jsx("span", {
|
|
234
|
+
className: "max-w-32 truncate",
|
|
235
|
+
children: activeItem?.label ?? label
|
|
236
|
+
}),
|
|
237
|
+
/* @__PURE__ */ jsx(ChevronDown, {
|
|
238
|
+
"aria-hidden": true,
|
|
239
|
+
className: cn("size-3 transition-transform", resolvedOpen && "rotate-180")
|
|
240
|
+
})
|
|
241
|
+
]
|
|
242
|
+
});
|
|
243
|
+
return /* @__PURE__ */ jsx("div", {
|
|
244
|
+
"data-slot": "section-jumper",
|
|
245
|
+
className: cn("w-fit", className),
|
|
246
|
+
...props,
|
|
247
|
+
children: /* @__PURE__ */ jsxs(Popover, {
|
|
248
|
+
open: resolvedOpen,
|
|
249
|
+
onOpenChange: setOpen,
|
|
250
|
+
children: [/* @__PURE__ */ jsx(PopoverTrigger, {
|
|
251
|
+
render: isMobile ? mobileTrigger : desktopTrigger,
|
|
252
|
+
openOnHover: !isMobile,
|
|
253
|
+
closeDelay: 100
|
|
254
|
+
}), /* @__PURE__ */ jsxs(PopoverContent, {
|
|
255
|
+
align: isMobile ? "center" : "end",
|
|
256
|
+
side: isMobile ? "top" : "left",
|
|
257
|
+
sideOffset: 8,
|
|
258
|
+
showArrow: false,
|
|
259
|
+
className: cn("border border-line-subtle shadow-2 px-4 pb-4 pt-3", isMobile ? "w-90 rounded-2xl" : "w-60 rounded-2xl"),
|
|
260
|
+
children: [/* @__PURE__ */ jsx("p", {
|
|
261
|
+
className: cn("border-b border-line-subtle pb-2 font-semibold text-fg-primary", isMobile ? "text-gdt-md" : "text-gdt-sm"),
|
|
262
|
+
children: label
|
|
263
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
264
|
+
className: "pt-2",
|
|
265
|
+
children: /* @__PURE__ */ jsx(SectionJumperMenu, {
|
|
266
|
+
items,
|
|
267
|
+
onSelect: select,
|
|
268
|
+
controller
|
|
269
|
+
})
|
|
270
|
+
})]
|
|
271
|
+
})]
|
|
272
|
+
})
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
//#endregion
|
|
276
|
+
export { SectionJumper, SectionJumperProvider };
|
package/dist/select.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { n as ComponentSizeValue } from "./size-context-BVhHduLi.js";
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
import { Select as Select$1 } from "@base-ui/react/select";
|
|
4
4
|
//#region src/select.d.ts
|
|
5
|
-
type SelectSize =
|
|
5
|
+
type SelectSize = ComponentSizeValue;
|
|
6
6
|
declare function Select<Value, Multiple extends boolean | undefined = false>({ multiple, children, size, ...props }: Select$1.Root.Props<Value, Multiple> & {
|
|
7
7
|
size?: SelectSize;
|
|
8
8
|
}): React.JSX.Element;
|
|
@@ -11,11 +11,16 @@ declare function SelectValue({ className, ...props }: Select$1.Value.Props): Rea
|
|
|
11
11
|
declare function SelectTrigger({ className, children, unstyled, ...props }: Select$1.Trigger.Props & {
|
|
12
12
|
unstyled?: boolean;
|
|
13
13
|
}): React.JSX.Element;
|
|
14
|
-
declare function SelectContent({ className, children, side, sideOffset, align, alignOffset, alignItemWithTrigger, ...props }: Select$1.Popup.Props & Pick<Select$1.Positioner.Props, "align" | "alignOffset" | "side" | "sideOffset" | "alignItemWithTrigger">
|
|
14
|
+
declare function SelectContent({ className, children, header, footer, side, sideOffset, align, alignOffset, alignItemWithTrigger, ...props }: Select$1.Popup.Props & Pick<Select$1.Positioner.Props, "align" | "alignOffset" | "side" | "sideOffset" | "alignItemWithTrigger"> & {
|
|
15
|
+
header?: React.ReactNode;
|
|
16
|
+
footer?: React.ReactNode;
|
|
17
|
+
}): React.JSX.Element;
|
|
18
|
+
declare function SelectHeader({ className, type, ...props }: React.ComponentProps<"button">): React.JSX.Element;
|
|
19
|
+
declare function SelectFooter({ className, type, ...props }: React.ComponentProps<"button">): React.JSX.Element;
|
|
15
20
|
declare function SelectLabel({ className, ...props }: Select$1.GroupLabel.Props): React.JSX.Element;
|
|
16
21
|
declare function SelectItem({ className, children, ...props }: Select$1.Item.Props): React.JSX.Element;
|
|
17
22
|
declare function SelectSeparator({ className, ...props }: Select$1.Separator.Props): React.JSX.Element;
|
|
18
23
|
declare function SelectScrollUpButton({ className, ...props }: React.ComponentProps<typeof Select$1.ScrollUpArrow>): React.JSX.Element;
|
|
19
24
|
declare function SelectScrollDownButton({ className, ...props }: React.ComponentProps<typeof Select$1.ScrollDownArrow>): React.JSX.Element;
|
|
20
25
|
//#endregion
|
|
21
|
-
export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, type SelectSize, SelectTrigger, SelectValue };
|
|
26
|
+
export { Select, SelectContent, SelectFooter, SelectGroup, SelectHeader, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, type SelectSize, SelectTrigger, SelectValue };
|
package/dist/select.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { Check, ChevronDown, ChevronUp } from "./icons.js";
|
|
3
|
-
import {
|
|
4
|
-
import { SizeProvider,
|
|
3
|
+
import { cn } from "./utils/cn.js";
|
|
4
|
+
import { SizeProvider, responsiveValueClasses, useComponentSizeValue } from "./size-context.js";
|
|
5
5
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
6
|
import { cva } from "class-variance-authority";
|
|
7
7
|
import * as React from "react";
|
|
@@ -29,11 +29,11 @@ const selectTriggerVariants = cva("group/select-trigger flex w-fit min-w-0 items
|
|
|
29
29
|
} },
|
|
30
30
|
defaultVariants: { size: "md" }
|
|
31
31
|
});
|
|
32
|
-
const selectContentVariants = cva("relative isolate z-50 max-h-(--available-height) w-(--anchor-width) min-w-36 origin-(--transform-origin)
|
|
32
|
+
const selectContentVariants = cva("relative isolate z-50 flex max-h-(--available-height) w-(--anchor-width) min-w-36 origin-(--transform-origin) flex-col overflow-hidden border border-line-subtle bg-canvas text-fg-primary shadow-(--elevation-e1-shadow) transition-[opacity,scale,translate] duration-[var(--duration-motion-popup)] ease-gdt-out data-[align-trigger=true]:transition-none not-data-[align-trigger=true]:data-starting-style:opacity-0 not-data-[align-trigger=true]:data-starting-style:scale-95 not-data-[align-trigger=true]:data-ending-style:opacity-0 not-data-[align-trigger=true]:data-ending-style:scale-95 not-data-[align-trigger=true]:data-[side=bottom]:data-starting-style:translate-y-2 not-data-[align-trigger=true]:data-[side=bottom]:data-ending-style:translate-y-2 not-data-[align-trigger=true]:data-[side=top]:data-starting-style:-translate-y-2 not-data-[align-trigger=true]:data-[side=top]:data-ending-style:-translate-y-2 not-data-[align-trigger=true]:data-[side=left]:data-starting-style:translate-x-2 not-data-[align-trigger=true]:data-[side=left]:data-ending-style:translate-x-2 not-data-[align-trigger=true]:data-[side=right]:data-starting-style:-translate-x-2 not-data-[align-trigger=true]:data-[side=right]:data-ending-style:-translate-x-2 not-data-[align-trigger=true]:data-[side=inline-end]:data-starting-style:-translate-x-2 not-data-[align-trigger=true]:data-[side=inline-end]:data-ending-style:-translate-x-2 not-data-[align-trigger=true]:data-[side=inline-start]:data-starting-style:translate-x-2 not-data-[align-trigger=true]:data-[side=inline-start]:data-ending-style:translate-x-2 motion-reduce:not-data-[align-trigger=true]:data-starting-style:scale-100 motion-reduce:not-data-[align-trigger=true]:data-ending-style:scale-100 motion-reduce:not-data-[align-trigger=true]:data-[side=bottom]:data-starting-style:translate-y-0 motion-reduce:not-data-[align-trigger=true]:data-[side=bottom]:data-ending-style:translate-y-0 motion-reduce:not-data-[align-trigger=true]:data-[side=top]:data-starting-style:translate-y-0 motion-reduce:not-data-[align-trigger=true]:data-[side=top]:data-ending-style:translate-y-0 motion-reduce:not-data-[align-trigger=true]:data-[side=left]:data-starting-style:translate-x-0 motion-reduce:not-data-[align-trigger=true]:data-[side=left]:data-ending-style:translate-x-0 motion-reduce:not-data-[align-trigger=true]:data-[side=right]:data-starting-style:translate-x-0 motion-reduce:not-data-[align-trigger=true]:data-[side=right]:data-ending-style:translate-x-0 motion-reduce:not-data-[align-trigger=true]:data-[side=inline-end]:data-starting-style:translate-x-0 motion-reduce:not-data-[align-trigger=true]:data-[side=inline-end]:data-ending-style:translate-x-0 motion-reduce:not-data-[align-trigger=true]:data-[side=inline-start]:data-starting-style:translate-x-0 motion-reduce:not-data-[align-trigger=true]:data-[side=inline-start]:data-ending-style:translate-x-0", {
|
|
33
33
|
variants: { size: {
|
|
34
|
-
sm: "rounded-lg
|
|
35
|
-
md: "rounded-xl
|
|
36
|
-
lg: "rounded-[18px]
|
|
34
|
+
sm: "rounded-lg",
|
|
35
|
+
md: "rounded-xl",
|
|
36
|
+
lg: "rounded-[18px]"
|
|
37
37
|
} },
|
|
38
38
|
defaultVariants: { size: "md" }
|
|
39
39
|
});
|
|
@@ -45,6 +45,74 @@ const selectItemVariants = cva("group/select-item relative flex w-full cursor-po
|
|
|
45
45
|
} },
|
|
46
46
|
defaultVariants: { size: "md" }
|
|
47
47
|
});
|
|
48
|
+
const responsiveSelectTriggerSizes = {
|
|
49
|
+
base: {
|
|
50
|
+
sm: "h-8 gap-2 px-3 text-gdt-xs [&_svg:not([class*='size-'])]:size-3.5",
|
|
51
|
+
md: "h-10 gap-2 px-3.5 text-gdt-sm [&_svg:not([class*='size-'])]:size-4",
|
|
52
|
+
lg: "h-12 gap-2.5 px-4 pr-5 text-gdt-md [&_svg:not([class*='size-'])]:size-4.5"
|
|
53
|
+
},
|
|
54
|
+
md: {
|
|
55
|
+
sm: "md:h-8 md:gap-2 md:px-3 md:text-gdt-xs md:[&_svg:not([class*='size-'])]:size-3.5",
|
|
56
|
+
md: "md:h-10 md:gap-2 md:px-3.5 md:text-gdt-sm md:[&_svg:not([class*='size-'])]:size-4",
|
|
57
|
+
lg: "md:h-12 md:gap-2.5 md:px-4 md:pr-5 md:text-gdt-md md:[&_svg:not([class*='size-'])]:size-4.5"
|
|
58
|
+
},
|
|
59
|
+
lg: {
|
|
60
|
+
sm: "lg:h-8 lg:gap-2 lg:px-3 lg:text-gdt-xs lg:[&_svg:not([class*='size-'])]:size-3.5",
|
|
61
|
+
md: "lg:h-10 lg:gap-2 lg:px-3.5 lg:text-gdt-sm lg:[&_svg:not([class*='size-'])]:size-4",
|
|
62
|
+
lg: "lg:h-12 lg:gap-2.5 lg:px-4 lg:pr-5 lg:text-gdt-md lg:[&_svg:not([class*='size-'])]:size-4.5"
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
const responsiveSelectContentSizes = {
|
|
66
|
+
base: {
|
|
67
|
+
sm: "rounded-lg",
|
|
68
|
+
md: "rounded-xl",
|
|
69
|
+
lg: "rounded-[18px]"
|
|
70
|
+
},
|
|
71
|
+
md: {
|
|
72
|
+
sm: "md:rounded-lg",
|
|
73
|
+
md: "md:rounded-xl",
|
|
74
|
+
lg: "md:rounded-[18px]"
|
|
75
|
+
},
|
|
76
|
+
lg: {
|
|
77
|
+
sm: "lg:rounded-lg",
|
|
78
|
+
md: "lg:rounded-xl",
|
|
79
|
+
lg: "lg:rounded-[18px]"
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
const responsiveSelectItemSizes = {
|
|
83
|
+
base: {
|
|
84
|
+
sm: "gap-1.5 rounded-md px-3 py-1.5 text-gdt-xs",
|
|
85
|
+
md: "gap-2 rounded-md px-4 py-2 text-gdt-sm",
|
|
86
|
+
lg: "gap-2.5 rounded-md px-4 py-2.5 text-gdt-md"
|
|
87
|
+
},
|
|
88
|
+
md: {
|
|
89
|
+
sm: "md:gap-1.5 md:px-3 md:py-1.5 md:text-gdt-xs",
|
|
90
|
+
md: "md:gap-2 md:px-4 md:py-2 md:text-gdt-sm",
|
|
91
|
+
lg: "md:gap-2.5 md:px-4 md:py-2.5 md:text-gdt-md"
|
|
92
|
+
},
|
|
93
|
+
lg: {
|
|
94
|
+
sm: "lg:gap-1.5 lg:px-3 lg:py-1.5 lg:text-gdt-xs",
|
|
95
|
+
md: "lg:gap-2 lg:px-4 lg:py-2 lg:text-gdt-sm",
|
|
96
|
+
lg: "lg:gap-2.5 lg:px-4 lg:py-2.5 lg:text-gdt-md"
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
const responsiveSelectBodySizes = {
|
|
100
|
+
base: {
|
|
101
|
+
sm: "p-1",
|
|
102
|
+
md: "p-1.5",
|
|
103
|
+
lg: "p-2"
|
|
104
|
+
},
|
|
105
|
+
md: {
|
|
106
|
+
sm: "md:p-1",
|
|
107
|
+
md: "md:p-1.5",
|
|
108
|
+
lg: "md:p-2"
|
|
109
|
+
},
|
|
110
|
+
lg: {
|
|
111
|
+
sm: "lg:p-1",
|
|
112
|
+
md: "lg:p-1.5",
|
|
113
|
+
lg: "lg:p-2"
|
|
114
|
+
}
|
|
115
|
+
};
|
|
48
116
|
function SelectGroup({ className, ...props }) {
|
|
49
117
|
return /* @__PURE__ */ jsx(Select$1.Group, {
|
|
50
118
|
"data-slot": "select-group",
|
|
@@ -60,17 +128,18 @@ function SelectValue({ className, ...props }) {
|
|
|
60
128
|
});
|
|
61
129
|
}
|
|
62
130
|
function SelectTrigger({ className, children, unstyled, ...props }) {
|
|
63
|
-
const resolvedSize =
|
|
131
|
+
const resolvedSize = responsiveValueClasses(useComponentSizeValue(), responsiveSelectTriggerSizes);
|
|
64
132
|
return /* @__PURE__ */ jsxs(Select$1.Trigger, {
|
|
65
133
|
"data-slot": "select-trigger",
|
|
66
|
-
"data-size": resolvedSize,
|
|
67
|
-
className: cn(!unstyled && selectTriggerVariants({ size:
|
|
134
|
+
"data-size": resolvedSize.base,
|
|
135
|
+
className: cn(!unstyled && selectTriggerVariants({ size: null }), !unstyled && resolvedSize.className, className),
|
|
68
136
|
...props,
|
|
69
137
|
children: [children, /* @__PURE__ */ jsx(Select$1.Icon, { render: /* @__PURE__ */ jsx(ChevronDown, { className: "text-line-strong transition-transform group-data-disabled/select-trigger:text-fg-caption-placeholder data-popup-open:rotate-180" }) })]
|
|
70
138
|
});
|
|
71
139
|
}
|
|
72
|
-
function SelectContent({ className, children, side = "bottom", sideOffset = 8, align = "center", alignOffset = 0, alignItemWithTrigger = false, ...props }) {
|
|
73
|
-
const resolvedSize =
|
|
140
|
+
function SelectContent({ className, children, header, footer, side = "bottom", sideOffset = 8, align = "center", alignOffset = 0, alignItemWithTrigger = false, ...props }) {
|
|
141
|
+
const resolvedSize = responsiveValueClasses(useComponentSizeValue(), responsiveSelectContentSizes);
|
|
142
|
+
const bodySize = responsiveValueClasses(useComponentSizeValue(), responsiveSelectBodySizes);
|
|
74
143
|
return /* @__PURE__ */ jsx(Select$1.Portal, { children: /* @__PURE__ */ jsx(Select$1.Positioner, {
|
|
75
144
|
side,
|
|
76
145
|
sideOffset,
|
|
@@ -81,19 +150,43 @@ function SelectContent({ className, children, side = "bottom", sideOffset = 8, a
|
|
|
81
150
|
children: /* @__PURE__ */ jsxs(Select$1.Popup, {
|
|
82
151
|
"data-slot": "select-content",
|
|
83
152
|
"data-align-trigger": alignItemWithTrigger,
|
|
84
|
-
className: cn(selectContentVariants({ size:
|
|
153
|
+
className: cn(selectContentVariants({ size: null }), resolvedSize.className, className),
|
|
85
154
|
...props,
|
|
86
155
|
children: [
|
|
87
|
-
|
|
88
|
-
/* @__PURE__ */
|
|
89
|
-
|
|
90
|
-
|
|
156
|
+
header,
|
|
157
|
+
/* @__PURE__ */ jsxs("div", {
|
|
158
|
+
"data-slot": "select-content-body",
|
|
159
|
+
className: cn("min-h-0 flex-1 overflow-y-auto", bodySize.className),
|
|
160
|
+
children: [
|
|
161
|
+
/* @__PURE__ */ jsx(SelectScrollUpButton, {}),
|
|
162
|
+
/* @__PURE__ */ jsx(Select$1.List, {
|
|
163
|
+
className: "space-y-0.5",
|
|
164
|
+
children
|
|
165
|
+
}),
|
|
166
|
+
/* @__PURE__ */ jsx(SelectScrollDownButton, {})
|
|
167
|
+
]
|
|
91
168
|
}),
|
|
92
|
-
|
|
169
|
+
footer
|
|
93
170
|
]
|
|
94
171
|
})
|
|
95
172
|
}) });
|
|
96
173
|
}
|
|
174
|
+
function SelectHeader({ className, type = "button", ...props }) {
|
|
175
|
+
return /* @__PURE__ */ jsx("button", {
|
|
176
|
+
type,
|
|
177
|
+
"data-slot": "select-header",
|
|
178
|
+
className: cn("relative z-20 flex min-h-9 w-full cursor-pointer items-center gap-2 rounded-none rounded-t-[inherit] border-line-subtle border-b bg-canvas px-3 py-2 text-left text-gdt-sm font-bold text-fg-brand outline-none transition-colors hover:bg-surface-brand-subtle focus-visible:bg-surface-brand-subtle focus-visible:inset-ring-2 focus-visible:inset-ring-line-focus active:bg-surface-brand-subtle disabled:pointer-events-none disabled:text-fg-caption-placeholder", "[&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", className),
|
|
179
|
+
...props
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
function SelectFooter({ className, type = "button", ...props }) {
|
|
183
|
+
return /* @__PURE__ */ jsx("button", {
|
|
184
|
+
type,
|
|
185
|
+
"data-slot": "select-footer",
|
|
186
|
+
className: cn("relative z-20 flex min-h-9 w-full cursor-pointer items-center gap-2 rounded-none rounded-b-[inherit] border-line-subtle border-t bg-canvas px-3 py-2 text-left text-gdt-sm font-semibold text-fg-secondary outline-none transition-colors hover:bg-surface focus-visible:bg-surface focus-visible:inset-ring-2 focus-visible:inset-ring-line-focus active:bg-surface-raised disabled:pointer-events-none disabled:text-fg-caption-placeholder", "[&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", className),
|
|
187
|
+
...props
|
|
188
|
+
});
|
|
189
|
+
}
|
|
97
190
|
function SelectLabel({ className, ...props }) {
|
|
98
191
|
return /* @__PURE__ */ jsx(Select$1.GroupLabel, {
|
|
99
192
|
"data-slot": "select-label",
|
|
@@ -103,10 +196,10 @@ function SelectLabel({ className, ...props }) {
|
|
|
103
196
|
}
|
|
104
197
|
function SelectItem({ className, children, ...props }) {
|
|
105
198
|
const { multiple } = React.useContext(SelectSelectionContext);
|
|
106
|
-
const resolvedSize =
|
|
199
|
+
const resolvedSize = responsiveValueClasses(useComponentSizeValue(), responsiveSelectItemSizes);
|
|
107
200
|
return /* @__PURE__ */ jsxs(Select$1.Item, {
|
|
108
201
|
"data-slot": "select-item",
|
|
109
|
-
className: cn(selectItemVariants({ size:
|
|
202
|
+
className: cn(selectItemVariants({ size: null }), resolvedSize.className, !multiple && "data-selected:bg-surface-brand-subtle data-selected:font-medium data-selected:text-fg-brand", className),
|
|
110
203
|
...props,
|
|
111
204
|
children: [multiple ? /* @__PURE__ */ jsx(Select$1.ItemIndicator, {
|
|
112
205
|
keepMounted: true,
|
|
@@ -142,4 +235,4 @@ function SelectScrollDownButton({ className, ...props }) {
|
|
|
142
235
|
});
|
|
143
236
|
}
|
|
144
237
|
//#endregion
|
|
145
|
-
export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue };
|
|
238
|
+
export { Select, SelectContent, SelectFooter, SelectGroup, SelectHeader, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue };
|
package/dist/separator.js
CHANGED
package/dist/sheet.d.ts
CHANGED
|
@@ -9,6 +9,8 @@ type SheetContentProps = Dialog.Popup.Props & {
|
|
|
9
9
|
side?: SheetSide;
|
|
10
10
|
showCloseButton?: boolean;
|
|
11
11
|
showOverlay?: boolean;
|
|
12
|
+
/** @internal Positions specialized popup shells without changing the surface. */
|
|
13
|
+
popupClassName?: string;
|
|
12
14
|
} & ({
|
|
13
15
|
side: "top" | "bottom";
|
|
14
16
|
size?: "fullscreen";
|
|
@@ -16,7 +18,7 @@ type SheetContentProps = Dialog.Popup.Props & {
|
|
|
16
18
|
side?: "left" | "right";
|
|
17
19
|
size?: "sm" | "md" | "lg";
|
|
18
20
|
});
|
|
19
|
-
declare function SheetContent({ className, children, side, size, showCloseButton, showOverlay, ...props }: SheetContentProps): React.JSX.Element;
|
|
21
|
+
declare function SheetContent({ className, children, side, size, showCloseButton, showOverlay, popupClassName, ...props }: SheetContentProps): React.JSX.Element;
|
|
20
22
|
declare function SheetHeader({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
21
23
|
declare function SheetBody({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
|
22
24
|
declare function SheetFooter({ className, ...props }: React.ComponentProps<"div">): React.JSX.Element;
|
package/dist/sheet.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { X } from "./icons.js";
|
|
3
|
-
import {
|
|
3
|
+
import { cn } from "./utils/cn.js";
|
|
4
4
|
import { SizeProvider } from "./size-context.js";
|
|
5
5
|
import { Button } from "./button.js";
|
|
6
6
|
import { DialogNestingProvider, useDialogNestingDepth } from "./dialog-nesting.js";
|
|
@@ -42,7 +42,7 @@ function SheetOverlay({ className, ...props }) {
|
|
|
42
42
|
...props
|
|
43
43
|
});
|
|
44
44
|
}
|
|
45
|
-
const sheetContentVariants = cva("group/sheet-content fixed z-50
|
|
45
|
+
const sheetContentVariants = cva("group/sheet-content pointer-events-none fixed z-50 overflow-visible transition-[opacity,scale,translate] duration-[var(--duration-motion-surface)] ease-gdt-drawer data-ending-style:opacity-0 data-starting-style:opacity-0 [--sheet-padding-x:1rem] [--sheet-padding-top:1rem] data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:w-full data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:w-full data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=bottom]:data-ending-style:translate-y-full data-[side=bottom]:data-starting-style:translate-y-full data-[side=left]:data-ending-style:-translate-x-full data-[side=left]:data-starting-style:-translate-x-full data-[side=right]:data-ending-style:translate-x-full data-[side=right]:data-starting-style:translate-x-full data-[side=top]:data-ending-style:-translate-y-full data-[side=top]:data-starting-style:-translate-y-full motion-reduce:data-[side=bottom]:data-ending-style:translate-y-0 motion-reduce:data-[side=bottom]:data-starting-style:translate-y-0 motion-reduce:data-[side=left]:data-ending-style:translate-x-0 motion-reduce:data-[side=left]:data-starting-style:translate-x-0 motion-reduce:data-[side=right]:data-ending-style:translate-x-0 motion-reduce:data-[side=right]:data-starting-style:translate-x-0 motion-reduce:data-[side=top]:data-ending-style:translate-y-0 motion-reduce:data-[side=top]:data-starting-style:translate-y-0 data-[side=bottom]:data-[nested-dialog-open]:translate-y-[calc(var(--nested-dialogs)*-1.5rem)] data-[side=top]:data-[nested-dialog-open]:translate-y-[calc(var(--nested-dialogs)*1.5rem)] data-[side=left]:data-[nested-dialog-open]:translate-x-[calc(var(--nested-dialogs)*1.5rem)] data-[side=right]:data-[nested-dialog-open]:translate-x-[calc(var(--nested-dialogs)*-1.5rem)] data-[side=bottom]:data-[nested-dialog-open]:scale-x-[calc(1_-_var(--nested-dialogs)*0.05)] data-[side=top]:data-[nested-dialog-open]:scale-x-[calc(1_-_var(--nested-dialogs)*0.05)]", {
|
|
46
46
|
variants: { size: {
|
|
47
47
|
sm: "sm:[--sheet-padding-top:1.5rem] sm:[--sheet-padding-x:1.5rem] w-90 max-w-[calc(100vw-2.5rem)] [--sheet-title:var(--text-gdt-h5)]",
|
|
48
48
|
md: "sm:[--sheet-padding-top:1.5rem] sm:[--sheet-padding-x:2rem] xl:[--sheet-padding-x:2.5rem] w-120 max-w-[calc(100vw-2.5rem)] [--sheet-title:var(--text-gdt-h4)]",
|
|
@@ -51,7 +51,7 @@ const sheetContentVariants = cva("group/sheet-content fixed z-50 flex flex-col g
|
|
|
51
51
|
} },
|
|
52
52
|
defaultVariants: { size: "md" }
|
|
53
53
|
});
|
|
54
|
-
function SheetContent({ className, children, side = "left", size = "md", showCloseButton = true, showOverlay = true, ...props }) {
|
|
54
|
+
function SheetContent({ className, children, side = "left", size = "md", showCloseButton = true, showOverlay = true, popupClassName, ...props }) {
|
|
55
55
|
const resolvedSize = side === "top" || side === "bottom" ? "fullscreen" : size !== "fullscreen" ? size : "md";
|
|
56
56
|
return /* @__PURE__ */ jsxs(SheetPortal, { children: [showOverlay && /* @__PURE__ */ jsx(SheetOverlay, {}), /* @__PURE__ */ jsx(SizeProvider, {
|
|
57
57
|
size: resolvedSize === "fullscreen" ? "lg" : resolvedSize,
|
|
@@ -59,13 +59,17 @@ function SheetContent({ className, children, side = "left", size = "md", showClo
|
|
|
59
59
|
"data-slot": "sheet-content",
|
|
60
60
|
"data-side": side,
|
|
61
61
|
"data-size": resolvedSize,
|
|
62
|
-
className: cn(sheetContentVariants({ size: resolvedSize }),
|
|
62
|
+
className: cn(sheetContentVariants({ size: resolvedSize }), popupClassName),
|
|
63
63
|
...props,
|
|
64
|
-
children: [
|
|
64
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
65
|
+
"data-slot": "sheet-surface",
|
|
66
|
+
className: cn("pointer-events-auto flex size-full flex-col gap-0 overflow-visible rounded-2xl border border-line-subtle bg-surface-overlay bg-clip-padding text-fg-primary shadow-(--elevation-e2-shadow) group-data-[side=bottom]/sheet-content:rounded-b-none group-data-[side=top]/sheet-content:rounded-t-none group-data-[side=left]/sheet-content:rounded-l-none group-data-[side=right]/sheet-content:rounded-r-none", className),
|
|
67
|
+
children
|
|
68
|
+
}), showCloseButton && /* @__PURE__ */ jsx(Dialog.Close, {
|
|
65
69
|
"data-slot": "sheet-close",
|
|
66
70
|
render: /* @__PURE__ */ jsxs(Button, {
|
|
67
71
|
variant: "ghost",
|
|
68
|
-
className: "absolute z-10 size-7 border border-line bg-surface p-0 text-fg-primary shadow-(--elevation-e1-shadow) hover:bg-surface-raised group-data-[nested-dialog-open]/sheet-content:hidden group-data-[side=bottom]/sheet-content:-top-9 group-data-[side=bottom]/sheet-content:right-4 group-data-[side=top]/sheet-content:-bottom-9 group-data-[side=top]/sheet-content:right-4 group-data-[side=left]/sheet-content:-right-9 group-data-[side=left]/sheet-content:top-4 group-data-[side=right]/sheet-content:-left-9 group-data-[side=right]/sheet-content:top-4",
|
|
72
|
+
className: "pointer-events-auto absolute z-10 size-7 border border-line bg-surface p-0 text-fg-primary shadow-(--elevation-e1-shadow) hover:bg-surface-raised group-data-[nested-dialog-open]/sheet-content:hidden group-data-[side=bottom]/sheet-content:-top-9 group-data-[side=bottom]/sheet-content:right-4 group-data-[side=top]/sheet-content:-bottom-9 group-data-[side=top]/sheet-content:right-4 group-data-[side=left]/sheet-content:-right-9 group-data-[side=left]/sheet-content:top-4 group-data-[side=right]/sheet-content:-left-9 group-data-[side=right]/sheet-content:top-4",
|
|
69
73
|
size: "icon-xs",
|
|
70
74
|
children: [/* @__PURE__ */ jsx(X, {}), /* @__PURE__ */ jsx("span", {
|
|
71
75
|
className: "sr-only",
|
package/dist/sidebar.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Separator } from "./separator.js";
|
|
2
|
-
import { t as Button } from "./button-
|
|
3
|
-
import {
|
|
2
|
+
import { t as Button } from "./button-BS5KCibF.js";
|
|
3
|
+
import { Input } from "./input.js";
|
|
4
4
|
import { TooltipContent } from "./tooltip.js";
|
|
5
5
|
import { useRender } from "@base-ui/react/use-render";
|
|
6
6
|
import { VariantProps } from "class-variance-authority";
|