@pathscale/ui 1.1.63 → 1.1.64

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.
@@ -2,6 +2,7 @@ import * as __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__ from "solid-js/web
2
2
  import "./Popover.css";
3
3
  import * as __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__ from "solid-js";
4
4
  import * as __WEBPACK_EXTERNAL_MODULE_tailwind_merge_e05e3e95__ from "tailwind-merge";
5
+ import * as __WEBPACK_EXTERNAL_MODULE__shared_overlayPosition_js_ab299723__ from "../_shared/overlayPosition.js";
5
6
  import * as __WEBPACK_EXTERNAL_MODULE__Popover_classes_js_917d7621__ from "./Popover.classes.js";
6
7
  var _tmpl$ = /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.template)("<div>"), _tmpl$2 = /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.template)('<svg aria-hidden=true data-slot=popover-arrow-svg height=12 viewBox="0 0 12 12"width=12 xmlns=http://www.w3.org/2000/svg><path d="M0 0C5.48483 8 6.5 8 12 0Z"fill=currentColor>'), _tmpl$3 = /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.template)("<span>"), _tmpl$4 = /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.template)("<h3>");
7
8
  const PopoverContext = (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.createContext)();
@@ -21,6 +22,7 @@ const PopoverRoot = (props)=>{
21
22
  "defaultOpen",
22
23
  "onOpenChange",
23
24
  "placement",
25
+ "autoFlip",
24
26
  "offset",
25
27
  "closeOnOutsideClick",
26
28
  "closeOnEscape",
@@ -31,6 +33,7 @@ const PopoverRoot = (props)=>{
31
33
  const [contentRef, setContentRef] = (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.createSignal)();
32
34
  const [triggerId] = (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.createSignal)(`popover-trigger-${Math.random().toString(36).slice(2, 8)}`);
33
35
  const [contentId] = (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.createSignal)(`popover-content-${Math.random().toString(36).slice(2, 8)}`);
36
+ const [resolvedPlacement, setResolvedPlacement] = (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.createSignal)(local.placement ?? "bottom");
34
37
  const isControlled = (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.createMemo)(()=>void 0 !== local.isOpen);
35
38
  const isOpen = (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.createMemo)(()=>isControlled() ? Boolean(local.isOpen) : internalOpen());
36
39
  const setIsOpen = (next, options)=>{
@@ -38,8 +41,10 @@ const PopoverRoot = (props)=>{
38
41
  if (isOpen() !== next) local.onOpenChange?.(next);
39
42
  if (!next && options?.focusTrigger) triggerRef()?.focus();
40
43
  };
41
- const placement = ()=>local.placement ?? "bottom";
44
+ const preferredPlacement = ()=>local.placement ?? "bottom";
45
+ const placement = ()=>resolvedPlacement();
42
46
  const offset = ()=>local.offset ?? 8;
47
+ const autoFlip = ()=>local.autoFlip ?? true;
43
48
  (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.onMount)(()=>{
44
49
  const handlePointerDown = (event)=>{
45
50
  if (!isOpen()) return;
@@ -72,7 +77,10 @@ const PopoverRoot = (props)=>{
72
77
  const ctx = {
73
78
  isOpen,
74
79
  setIsOpen,
80
+ preferredPlacement,
75
81
  placement,
82
+ setPlacement: setResolvedPlacement,
83
+ autoFlip,
76
84
  triggerRef,
77
85
  setTriggerRef,
78
86
  contentRef,
@@ -175,47 +183,72 @@ const PopoverContent = (props)=>{
175
183
  "sideOffset"
176
184
  ]);
177
185
  const ctx = usePopoverContext();
186
+ const overlayPosition = (0, __WEBPACK_EXTERNAL_MODULE__shared_overlayPosition_js_ab299723__.createOverlayPosition)({
187
+ open: ctx.isOpen,
188
+ triggerRef: ctx.triggerRef,
189
+ overlayRef: ctx.contentRef,
190
+ placement: ctx.preferredPlacement,
191
+ offset: ()=>local.sideOffset ?? ctx.offset(),
192
+ autoFlip: ctx.autoFlip,
193
+ align: ()=>"center"
194
+ });
195
+ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.createEffect)(()=>{
196
+ ctx.setPlacement(overlayPosition.placement());
197
+ });
178
198
  const style = ()=>{
179
- if ("string" == typeof local.style) return `${local.style}; --popover-offset: ${local.sideOffset ?? ctx.offset()}px;`;
199
+ const overlayStyle = overlayPosition.style();
200
+ if ("string" == typeof local.style) return [
201
+ local.style,
202
+ Object.entries(overlayStyle).map(([key, value])=>`${key}: ${String(value)}`).join("; ")
203
+ ].filter(Boolean).join("; ");
180
204
  return {
181
205
  ...local.style ?? {},
182
- "--popover-offset": `${local.sideOffset ?? ctx.offset()}px`
206
+ ...overlayStyle
183
207
  };
184
208
  };
185
- return (()=>{
186
- var _el$3 = _tmpl$();
187
- (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.use)((el)=>ctx.setContentRef(el), _el$3);
188
- (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.spread)(_el$3, (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.mergeProps)(others, {
189
- get id () {
190
- return ctx.contentId();
191
- },
192
- role: "dialog"
193
- }, ()=>({
194
- class: (0, __WEBPACK_EXTERNAL_MODULE_tailwind_merge_e05e3e95__.twMerge)(__WEBPACK_EXTERNAL_MODULE__Popover_classes_js_917d7621__.CLASSES.base, local.class, local.className)
195
- }), {
196
- "data-slot": "popover-content",
197
- get ["data-open"] () {
198
- return ctx.isOpen() ? "true" : "false";
199
- },
200
- get ["data-placement"] () {
201
- return ctx.placement();
202
- },
203
- get ["data-theme"] () {
204
- return local.dataTheme;
205
- },
206
- get style () {
207
- return style();
208
- },
209
- get ["aria-labelledby"] () {
210
- return ctx.triggerId();
211
- },
212
- get ["aria-hidden"] () {
213
- return ctx.isOpen() ? "false" : "true";
214
- }
215
- }), false, true);
216
- (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.insert)(_el$3, ()=>local.children);
217
- return _el$3;
218
- })();
209
+ return (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.createComponent)(__WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.Show, {
210
+ get when () {
211
+ return ctx.isOpen();
212
+ },
213
+ get children () {
214
+ return (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.createComponent)(__WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.Portal, {
215
+ get children () {
216
+ var _el$3 = _tmpl$();
217
+ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.use)((el)=>ctx.setContentRef(el), _el$3);
218
+ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.spread)(_el$3, (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.mergeProps)(others, {
219
+ get id () {
220
+ return ctx.contentId();
221
+ },
222
+ role: "dialog"
223
+ }, ()=>({
224
+ class: (0, __WEBPACK_EXTERNAL_MODULE_tailwind_merge_e05e3e95__.twMerge)(__WEBPACK_EXTERNAL_MODULE__Popover_classes_js_917d7621__.CLASSES.base, local.class, local.className)
225
+ }), {
226
+ "data-slot": "popover-content",
227
+ get ["data-open"] () {
228
+ return ctx.isOpen() ? "true" : "false";
229
+ },
230
+ get ["data-placement"] () {
231
+ return ctx.placement();
232
+ },
233
+ get ["data-theme"] () {
234
+ return local.dataTheme;
235
+ },
236
+ get style () {
237
+ return style();
238
+ },
239
+ get ["aria-labelledby"] () {
240
+ return ctx.triggerId();
241
+ },
242
+ get ["aria-hidden"] () {
243
+ return ctx.isOpen() ? "false" : "true";
244
+ }
245
+ }), false, true);
246
+ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.insert)(_el$3, ()=>local.children);
247
+ return _el$3;
248
+ }
249
+ });
250
+ }
251
+ });
219
252
  };
220
253
  const PopoverDialog = (props)=>{
221
254
  const [local, others] = (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.splitProps)(props, [
@@ -132,10 +132,8 @@
132
132
 
133
133
  .ui-select__popover {
134
134
  display: none;
135
- position: absolute;
135
+ position: fixed;
136
136
  z-index: 80;
137
- top: calc(100% + 0.375rem);
138
- inset-inline-start: 0;
139
137
  min-width: max(100%, 14rem);
140
138
  max-width: min(30rem, calc(100vw - 2rem));
141
139
  max-height: min(24rem, 70vh);
@@ -162,10 +160,46 @@
162
160
  display: block;
163
161
  visibility: visible;
164
162
  opacity: 1;
165
- transform: translateY(0) scale(1);
163
+ transform: scale(1);
166
164
  pointer-events: auto;
167
165
  }
168
166
 
167
+ .ui-select__popover[data-placement="top"] {
168
+ transform: translateY(4px) scale(0.98);
169
+ transform-origin: bottom;
170
+ }
171
+
172
+ .ui-select__popover[data-placement="top"][data-open="true"] {
173
+ transform: translateY(0) scale(1);
174
+ }
175
+
176
+ .ui-select__popover[data-placement="bottom"] {
177
+ transform: translateY(-4px) scale(0.98);
178
+ transform-origin: top;
179
+ }
180
+
181
+ .ui-select__popover[data-placement="bottom"][data-open="true"] {
182
+ transform: translateY(0) scale(1);
183
+ }
184
+
185
+ .ui-select__popover[data-placement="left"] {
186
+ transform: translateX(4px) scale(0.98);
187
+ transform-origin: right;
188
+ }
189
+
190
+ .ui-select__popover[data-placement="left"][data-open="true"] {
191
+ transform: translateX(0) scale(1);
192
+ }
193
+
194
+ .ui-select__popover[data-placement="right"] {
195
+ transform: translateX(-4px) scale(0.98);
196
+ transform-origin: left;
197
+ }
198
+
199
+ .ui-select__popover[data-placement="right"][data-open="true"] {
200
+ transform: translateX(0) scale(1);
201
+ }
202
+
169
203
  .ui-select__listbox {
170
204
  display: flex;
171
205
  flex-direction: column;
@@ -1,10 +1,12 @@
1
1
  import "./Select.css";
2
2
  import { type Component, type JSX } from "solid-js";
3
+ import { type OverlayPlacement } from "../_shared/overlayPosition";
3
4
  import type { IComponentBaseProps } from "../types";
4
5
  type SelectKey = string | number;
5
6
  export type SelectValueType = SelectKey | SelectKey[] | null;
6
7
  export type SelectVariant = "primary" | "secondary";
7
8
  export type SelectSelectionMode = "single" | "multiple";
9
+ export type SelectPlacement = OverlayPlacement;
8
10
  export type SelectRootProps = Omit<JSX.HTMLAttributes<HTMLDivElement>, "onChange"> & IComponentBaseProps & {
9
11
  children: JSX.Element;
10
12
  placeholder?: string;
@@ -19,6 +21,8 @@ export type SelectRootProps = Omit<JSX.HTMLAttributes<HTMLDivElement>, "onChange
19
21
  fullWidth?: boolean;
20
22
  variant?: SelectVariant;
21
23
  selectionMode?: SelectSelectionMode;
24
+ placement?: SelectPlacement;
25
+ autoFlip?: boolean;
22
26
  isOpen?: boolean;
23
27
  defaultOpen?: boolean;
24
28
  onOpenChange?: (open: boolean) => void;
@@ -2,6 +2,7 @@ import * as __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__ from "solid-js/web
2
2
  import "./Select.css";
3
3
  import * as __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__ from "solid-js";
4
4
  import * as __WEBPACK_EXTERNAL_MODULE_tailwind_merge_e05e3e95__ from "tailwind-merge";
5
+ import * as __WEBPACK_EXTERNAL_MODULE__shared_overlayPosition_js_ab299723__ from "../_shared/overlayPosition.js";
5
6
  import * as __WEBPACK_EXTERNAL_MODULE__Select_classes_js_98857364__ from "./Select.classes.js";
6
7
  var _tmpl$ = /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.template)("<div>"), _tmpl$2 = /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.template)("<button>"), _tmpl$3 = /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.template)("<span>"), _tmpl$4 = /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.template)("<span><span>"), _tmpl$5 = /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.template)("<button><span>");
7
8
  const SelectContext = (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.createContext)();
@@ -50,6 +51,8 @@ const SelectRoot = (props)=>{
50
51
  "fullWidth",
51
52
  "variant",
52
53
  "selectionMode",
54
+ "placement",
55
+ "autoFlip",
53
56
  "isOpen",
54
57
  "defaultOpen",
55
58
  "onOpenChange",
@@ -69,8 +72,11 @@ const SelectRoot = (props)=>{
69
72
  const [focusedKey, setFocusedKey] = (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.createSignal)();
70
73
  const [focusRequest, setFocusRequest] = (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.createSignal)(null);
71
74
  const [triggerRef, setTriggerRefSignal] = (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.createSignal)();
75
+ const [popoverRef, setPopoverRefSignal] = (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.createSignal)();
72
76
  const [rootRef, setRootRefSignal] = (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.createSignal)();
73
77
  const open = ()=>void 0 !== local.isOpen ? Boolean(local.isOpen) : internalOpen();
78
+ const placement = ()=>local.placement ?? "bottom";
79
+ const autoFlip = ()=>local.autoFlip ?? true;
74
80
  const selectedKeys = (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.createMemo)(()=>{
75
81
  const controlledValue = void 0 !== local.selectedKeys ? local.selectedKeys : local.value;
76
82
  if (void 0 !== controlledValue) return normalizeSelection(selectionMode(), controlledValue);
@@ -162,6 +168,9 @@ const SelectRoot = (props)=>{
162
168
  const setTriggerRef = (el)=>{
163
169
  setTriggerRefSignal(el);
164
170
  };
171
+ const setPopoverRef = (el)=>{
172
+ setPopoverRefSignal(el);
173
+ };
165
174
  const setRootRef = (el)=>{
166
175
  setRootRefSignal(el);
167
176
  if ("function" == typeof local.ref) local.ref(el);
@@ -185,9 +194,10 @@ const SelectRoot = (props)=>{
185
194
  (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.onMount)(()=>{
186
195
  const handlePointerDown = (event)=>{
187
196
  if (!open()) return;
188
- const root = rootRef();
189
- if (!root) return;
190
- if (root.contains(event.target)) return;
197
+ const target = event.target;
198
+ if (rootRef()?.contains(target)) return;
199
+ if (popoverRef()?.contains(target)) return;
200
+ if (triggerRef()?.contains(target)) return;
191
201
  setOpen(false);
192
202
  };
193
203
  document.addEventListener("pointerdown", handlePointerDown);
@@ -205,6 +215,10 @@ const SelectRoot = (props)=>{
205
215
  placeholder: ()=>local.placeholder ?? "Select an option",
206
216
  triggerId,
207
217
  listboxId,
218
+ placement,
219
+ autoFlip,
220
+ triggerRef,
221
+ popoverRef,
208
222
  selectedKeys,
209
223
  selectedText,
210
224
  focusedKey,
@@ -219,6 +233,7 @@ const SelectRoot = (props)=>{
219
233
  registerOption,
220
234
  unregisterOption,
221
235
  setTriggerRef,
236
+ setPopoverRef,
222
237
  setRootRef
223
238
  },
224
239
  get children () {
@@ -497,24 +512,64 @@ const SelectPopover = (props)=>{
497
512
  "children",
498
513
  "class",
499
514
  "className",
500
- "dataTheme"
515
+ "dataTheme",
516
+ "style"
501
517
  ]);
502
- return (()=>{
503
- var _el$10 = _tmpl$();
504
- (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.spread)(_el$10, (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.mergeProps)(others, ()=>({
505
- class: (0, __WEBPACK_EXTERNAL_MODULE_tailwind_merge_e05e3e95__.twMerge)(__WEBPACK_EXTERNAL_MODULE__Select_classes_js_98857364__.CLASSES.slot.popover, local.class, local.className)
506
- }), {
507
- get ["data-theme"] () {
508
- return local.dataTheme;
509
- },
510
- "data-slot": "ui-select-popover",
511
- get ["data-open"] () {
512
- return ctx?.open() ? "true" : "false";
513
- }
514
- }), false, true);
515
- (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.insert)(_el$10, ()=>local.children);
516
- return _el$10;
517
- })();
518
+ const overlayPosition = (0, __WEBPACK_EXTERNAL_MODULE__shared_overlayPosition_js_ab299723__.createOverlayPosition)({
519
+ open: ()=>ctx?.open() ?? false,
520
+ triggerRef: ()=>ctx?.triggerRef(),
521
+ overlayRef: ()=>ctx?.popoverRef(),
522
+ placement: ()=>ctx?.placement() ?? "bottom",
523
+ offset: ()=>6,
524
+ autoFlip: ()=>ctx?.autoFlip() ?? true,
525
+ align: ()=>"start",
526
+ matchTriggerWidth: ()=>true,
527
+ minWidth: ()=>224
528
+ });
529
+ const popoverStyle = ()=>{
530
+ const overlayStyle = overlayPosition.style();
531
+ if ("string" == typeof local.style) return [
532
+ local.style,
533
+ Object.entries(overlayStyle).map(([key, value])=>`${key}: ${String(value)}`).join("; ")
534
+ ].filter(Boolean).join("; ");
535
+ return {
536
+ ...local.style ?? {},
537
+ ...overlayStyle
538
+ };
539
+ };
540
+ return (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.createComponent)(__WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.Show, {
541
+ get when () {
542
+ return ctx?.open();
543
+ },
544
+ get children () {
545
+ return (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.createComponent)(__WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.Portal, {
546
+ get children () {
547
+ var _el$10 = _tmpl$();
548
+ var _ref$ = ctx?.setPopoverRef;
549
+ "function" == typeof _ref$ && (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.use)(_ref$, _el$10);
550
+ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.spread)(_el$10, (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.mergeProps)(others, ()=>({
551
+ class: (0, __WEBPACK_EXTERNAL_MODULE_tailwind_merge_e05e3e95__.twMerge)(__WEBPACK_EXTERNAL_MODULE__Select_classes_js_98857364__.CLASSES.slot.popover, local.class, local.className)
552
+ }), {
553
+ get ["data-theme"] () {
554
+ return local.dataTheme;
555
+ },
556
+ "data-slot": "ui-select-popover",
557
+ get ["data-open"] () {
558
+ return ctx?.open() ? "true" : "false";
559
+ },
560
+ get ["data-placement"] () {
561
+ return overlayPosition.placement();
562
+ },
563
+ get style () {
564
+ return popoverStyle();
565
+ }
566
+ }), false, true);
567
+ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.insert)(_el$10, ()=>local.children);
568
+ return _el$10;
569
+ }
570
+ });
571
+ }
572
+ });
518
573
  };
519
574
  const SelectListbox = (props)=>{
520
575
  const ctx = (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.useContext)(SelectContext);
@@ -1,2 +1,2 @@
1
1
  export { default } from "./Select";
2
- export type { SelectProps, SelectRootProps, SelectValueType, SelectVariant, SelectSelectionMode, SelectTriggerProps, SelectValueProps, SelectIndicatorProps, SelectPopoverProps, SelectListboxProps, SelectOptionProps, } from "./Select";
2
+ export type { SelectProps, SelectRootProps, SelectPlacement, SelectValueType, SelectVariant, SelectSelectionMode, SelectTriggerProps, SelectValueProps, SelectIndicatorProps, SelectPopoverProps, SelectListboxProps, SelectOptionProps, } from "./Select";
@@ -1,7 +1,7 @@
1
1
  export declare const CLASSES: {
2
2
  readonly base: "relative";
3
3
  readonly iconActive: "text-primary";
4
- readonly popover: "absolute z-50 mt-2 rounded-lg bg-base-200/80 p-4 shadow-xl backdrop-blur-sm";
4
+ readonly popover: "fixed z-50 rounded-lg bg-base-200/80 p-4 shadow-xl backdrop-blur-sm";
5
5
  readonly popoverAlignStart: "left-0";
6
6
  readonly popoverAlignEnd: "right-0";
7
7
  readonly row: "flex items-center gap-3";
@@ -1,7 +1,7 @@
1
1
  const CLASSES = {
2
2
  base: "relative",
3
3
  iconActive: "text-primary",
4
- popover: "absolute z-50 mt-2 rounded-lg bg-base-200/80 p-4 shadow-xl backdrop-blur-sm",
4
+ popover: "fixed z-50 rounded-lg bg-base-200/80 p-4 shadow-xl backdrop-blur-sm",
5
5
  popoverAlignStart: "left-0",
6
6
  popoverAlignEnd: "right-0",
7
7
  row: "flex items-center gap-3",
@@ -1,6 +1,8 @@
1
1
  import { type Component, type JSX } from "solid-js";
2
2
  import type { IComponentBaseProps } from "../types";
3
+ import { type OverlayPlacement } from "../_shared/overlayPosition";
3
4
  export type ThemeColorPickerAlign = "start" | "end";
5
+ export type ThemeColorPickerPlacement = OverlayPlacement;
4
6
  export interface ThemeColorPickerProps extends IComponentBaseProps {
5
7
  /**
6
8
  * Prefix for localStorage keys (e.g., "myapp" becomes "myapp_theme_color")
@@ -28,6 +30,16 @@ export interface ThemeColorPickerProps extends IComponentBaseProps {
28
30
  * @default "end"
29
31
  */
30
32
  align?: ThemeColorPickerAlign;
33
+ /**
34
+ * Preferred popover placement.
35
+ * @default "bottom"
36
+ */
37
+ placement?: ThemeColorPickerPlacement;
38
+ /**
39
+ * Automatically flip the popover when there is insufficient viewport space.
40
+ * @default true
41
+ */
42
+ autoFlip?: boolean;
31
43
  /**
32
44
  * Custom button content (defaults to palette icon)
33
45
  */
@@ -1,11 +1,11 @@
1
1
  import * as __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__ from "solid-js/web";
2
2
  import * as __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__ from "solid-js";
3
- import * as __WEBPACK_EXTERNAL_MODULE_clsx__ from "clsx";
4
3
  import * as __WEBPACK_EXTERNAL_MODULE_tailwind_merge_e05e3e95__ from "tailwind-merge";
5
4
  import * as __WEBPACK_EXTERNAL_MODULE__color_wheel_flower_index_js_cbe90990__ from "../color-wheel-flower/index.js";
6
5
  import * as __WEBPACK_EXTERNAL_MODULE__color_wheel_flower_ColorUtils_js_abf9b965__ from "../color-wheel-flower/ColorUtils.js";
7
6
  import * as __WEBPACK_EXTERNAL_MODULE__button_index_js_557db1f7__ from "../button/index.js";
8
7
  import * as __WEBPACK_EXTERNAL_MODULE__icon_index_js_1f7a158c__ from "../icon/index.js";
8
+ import * as __WEBPACK_EXTERNAL_MODULE__shared_overlayPosition_js_ab299723__ from "../_shared/overlayPosition.js";
9
9
  import * as __WEBPACK_EXTERNAL_MODULE__hueShift_js_ca4235e5__ from "./hueShift.js";
10
10
  import * as __WEBPACK_EXTERNAL_MODULE__ThemeColorPicker_classes_js_79a82485__ from "./ThemeColorPicker.classes.js";
11
11
  var _tmpl$ = /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.template)("<div><div></div><div>"), _tmpl$2 = /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.template)("<div>"), _tmpl$3 = /*#__PURE__*/ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.template)("<button type=button>");
@@ -20,6 +20,8 @@ const ThemeColorPicker_ThemeColorPicker = (props)=>{
20
20
  "onThemeSwitch",
21
21
  "aria-label",
22
22
  "align",
23
+ "placement",
24
+ "autoFlip",
23
25
  "children",
24
26
  "class",
25
27
  "className",
@@ -28,7 +30,8 @@ const ThemeColorPicker_ThemeColorPicker = (props)=>{
28
30
  ]);
29
31
  const [isOpen, setIsOpen] = (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.createSignal)(false);
30
32
  const [featureAvailable, setFeatureAvailable] = (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.createSignal)(true);
31
- let containerRef;
33
+ const [containerRef, setContainerRef] = (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.createSignal)();
34
+ const [popoverRef, setPopoverRef] = (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.createSignal)();
32
35
  const store = (0, __WEBPACK_EXTERNAL_MODULE__hueShift_js_ca4235e5__.createHueShiftStore)(local.storagePrefix ?? "theme");
33
36
  const colorValue = (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.createMemo)(()=>hexToColorValue(store.themeColor()));
34
37
  const handleColorChange = (color)=>{
@@ -81,7 +84,10 @@ const ThemeColorPicker_ThemeColorPicker = (props)=>{
81
84
  (0, __WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.createEffect)(()=>{
82
85
  if (!isOpen()) return;
83
86
  const handleClickOutside = (e)=>{
84
- if (containerRef && !containerRef.contains(e.target)) setIsOpen(false);
87
+ const target = e.target;
88
+ if (containerRef()?.contains(target)) return;
89
+ if (popoverRef()?.contains(target)) return;
90
+ setIsOpen(false);
85
91
  };
86
92
  const timer = setTimeout(()=>{
87
93
  document.addEventListener("click", handleClickOutside);
@@ -108,15 +114,24 @@ const ThemeColorPicker_ThemeColorPicker = (props)=>{
108
114
  onFormatChange: ()=>{}
109
115
  });
110
116
  const classes = ()=>(0, __WEBPACK_EXTERNAL_MODULE_tailwind_merge_e05e3e95__.twMerge)(__WEBPACK_EXTERNAL_MODULE__ThemeColorPicker_classes_js_79a82485__.CLASSES.base, local.class, local.className);
111
- const popoverClasses = ()=>(0, __WEBPACK_EXTERNAL_MODULE_clsx__["default"])(__WEBPACK_EXTERNAL_MODULE__ThemeColorPicker_classes_js_79a82485__.CLASSES.popover, "start" === local.align ? __WEBPACK_EXTERNAL_MODULE__ThemeColorPicker_classes_js_79a82485__.CLASSES.popoverAlignStart : __WEBPACK_EXTERNAL_MODULE__ThemeColorPicker_classes_js_79a82485__.CLASSES.popoverAlignEnd);
117
+ const popoverClasses = ()=>__WEBPACK_EXTERNAL_MODULE__ThemeColorPicker_classes_js_79a82485__.CLASSES.popover;
118
+ const overlayPosition = (0, __WEBPACK_EXTERNAL_MODULE__shared_overlayPosition_js_ab299723__.createOverlayPosition)({
119
+ open: isOpen,
120
+ triggerRef: containerRef,
121
+ overlayRef: popoverRef,
122
+ placement: ()=>local.placement ?? "bottom",
123
+ offset: ()=>8,
124
+ autoFlip: ()=>local.autoFlip ?? true,
125
+ align: ()=>"start" === local.align ? "start" : "end"
126
+ });
127
+ const popoverStyle = ()=>overlayPosition.style();
112
128
  return (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.createComponent)(__WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.Show, {
113
129
  get when () {
114
130
  return featureAvailable();
115
131
  },
116
132
  get children () {
117
133
  var _el$ = _tmpl$2();
118
- var _ref$ = containerRef;
119
- "function" == typeof _ref$ ? (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.use)(_ref$, _el$) : containerRef = _el$;
134
+ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.use)(setContainerRef, _el$);
120
135
  (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.spread)(_el$, (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.mergeProps)(()=>({
121
136
  class: classes()
122
137
  }), {
@@ -151,52 +166,64 @@ const ThemeColorPicker_ThemeColorPicker = (props)=>{
151
166
  return isOpen();
152
167
  },
153
168
  get children () {
154
- var _el$2 = _tmpl$2();
155
- (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.spread)(_el$2, (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.mergeProps)(()=>({
156
- class: popoverClasses()
157
- })), false, true);
158
- (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.insert)(_el$2, (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.createComponent)(__WEBPACK_EXTERNAL_MODULE__color_wheel_flower_index_js_cbe90990__.ColorPickerContext.Provider, {
159
- get value () {
160
- return contextValue();
161
- },
169
+ return (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.createComponent)(__WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.Portal, {
162
170
  get children () {
163
- var _el$3 = _tmpl$(), _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling;
164
- (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.spread)(_el$3, (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.mergeProps)(()=>({
165
- class: __WEBPACK_EXTERNAL_MODULE__ThemeColorPicker_classes_js_79a82485__.CLASSES.row
166
- })), false, true);
167
- (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.spread)(_el$4, (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.mergeProps)(()=>({
168
- class: __WEBPACK_EXTERNAL_MODULE__ThemeColorPicker_classes_js_79a82485__.CLASSES.wheelWrap
169
- })), false, true);
170
- (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.insert)(_el$4, (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.createComponent)(__WEBPACK_EXTERNAL_MODULE__color_wheel_flower_index_js_cbe90990__.ColorWheelFlower, (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.mergeProps)(()=>({
171
- class: __WEBPACK_EXTERNAL_MODULE__ThemeColorPicker_classes_js_79a82485__.CLASSES.wheelCustom
172
- }))));
173
- (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.spread)(_el$5, (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.mergeProps)(()=>({
174
- class: __WEBPACK_EXTERNAL_MODULE__ThemeColorPicker_classes_js_79a82485__.CLASSES.grayscaleList
175
- })), false, true);
176
- (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.insert)(_el$5, (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.createComponent)(__WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.For, {
177
- each: GRAYSCALE_SWATCHES,
178
- children: (g)=>(()=>{
179
- var _el$6 = _tmpl$3();
180
- (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.spread)(_el$6, (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.mergeProps)(()=>({
181
- class: __WEBPACK_EXTERNAL_MODULE__ThemeColorPicker_classes_js_79a82485__.CLASSES.swatchButton
182
- }), {
183
- get style () {
184
- return {
185
- "background-color": `${g.hex}`
186
- };
187
- },
188
- get ["aria-label"] () {
189
- return g.label;
190
- },
191
- onClick: ()=>handleGrayscale(g)
192
- }), false, false);
193
- return _el$6;
194
- })()
171
+ var _el$2 = _tmpl$2();
172
+ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.use)(setPopoverRef, _el$2);
173
+ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.spread)(_el$2, (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.mergeProps)(()=>({
174
+ class: popoverClasses()
175
+ }), {
176
+ get ["data-placement"] () {
177
+ return overlayPosition.placement();
178
+ },
179
+ get style () {
180
+ return popoverStyle();
181
+ }
182
+ }), false, true);
183
+ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.insert)(_el$2, (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.createComponent)(__WEBPACK_EXTERNAL_MODULE__color_wheel_flower_index_js_cbe90990__.ColorPickerContext.Provider, {
184
+ get value () {
185
+ return contextValue();
186
+ },
187
+ get children () {
188
+ var _el$3 = _tmpl$(), _el$4 = _el$3.firstChild, _el$5 = _el$4.nextSibling;
189
+ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.spread)(_el$3, (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.mergeProps)(()=>({
190
+ class: __WEBPACK_EXTERNAL_MODULE__ThemeColorPicker_classes_js_79a82485__.CLASSES.row
191
+ })), false, true);
192
+ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.spread)(_el$4, (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.mergeProps)(()=>({
193
+ class: __WEBPACK_EXTERNAL_MODULE__ThemeColorPicker_classes_js_79a82485__.CLASSES.wheelWrap
194
+ })), false, true);
195
+ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.insert)(_el$4, (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.createComponent)(__WEBPACK_EXTERNAL_MODULE__color_wheel_flower_index_js_cbe90990__.ColorWheelFlower, (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.mergeProps)(()=>({
196
+ class: __WEBPACK_EXTERNAL_MODULE__ThemeColorPicker_classes_js_79a82485__.CLASSES.wheelCustom
197
+ }))));
198
+ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.spread)(_el$5, (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.mergeProps)(()=>({
199
+ class: __WEBPACK_EXTERNAL_MODULE__ThemeColorPicker_classes_js_79a82485__.CLASSES.grayscaleList
200
+ })), false, true);
201
+ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.insert)(_el$5, (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.createComponent)(__WEBPACK_EXTERNAL_MODULE_solid_js_aeefcc6d__.For, {
202
+ each: GRAYSCALE_SWATCHES,
203
+ children: (g)=>(()=>{
204
+ var _el$6 = _tmpl$3();
205
+ (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.spread)(_el$6, (0, __WEBPACK_EXTERNAL_MODULE_solid_js_web_35d951b7__.mergeProps)(()=>({
206
+ class: __WEBPACK_EXTERNAL_MODULE__ThemeColorPicker_classes_js_79a82485__.CLASSES.swatchButton
207
+ }), {
208
+ get style () {
209
+ return {
210
+ "background-color": `${g.hex}`
211
+ };
212
+ },
213
+ get ["aria-label"] () {
214
+ return g.label;
215
+ },
216
+ onClick: ()=>handleGrayscale(g)
217
+ }), false, false);
218
+ return _el$6;
219
+ })()
220
+ }));
221
+ return _el$3;
222
+ }
195
223
  }));
196
- return _el$3;
224
+ return _el$2;
197
225
  }
198
- }));
199
- return _el$2;
226
+ });
200
227
  }
201
228
  }), null);
202
229
  return _el$;
@@ -1,3 +1,3 @@
1
1
  export { default as ThemeColorPicker } from "./ThemeColorPicker";
2
- export type { ThemeColorPickerProps, ThemeColorPickerAlign } from "./ThemeColorPicker";
2
+ export type { ThemeColorPickerProps, ThemeColorPickerAlign, ThemeColorPickerPlacement, } from "./ThemeColorPicker";
3
3
  export { createHueShiftStore, getDefaultHueShiftStore, resetHueShift, type HueShiftStore, } from "./hueShift";