shadcn_phlexcomponents 0.1.17 → 0.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/app/javascript/controllers/accordion_controller.js +90 -100
  3. data/app/javascript/controllers/alert_dialog_controller.js +4 -4
  4. data/app/javascript/controllers/avatar_controller.js +11 -11
  5. data/app/javascript/controllers/checkbox_controller.js +26 -25
  6. data/app/javascript/controllers/collapsible_controller.js +36 -34
  7. data/app/javascript/controllers/combobox_controller.js +231 -262
  8. data/app/javascript/controllers/command_controller.js +184 -204
  9. data/app/javascript/controllers/date_picker_controller.js +257 -240
  10. data/app/javascript/controllers/date_range_picker_controller.js +200 -188
  11. data/app/javascript/controllers/dialog_controller.js +78 -78
  12. data/app/javascript/controllers/dropdown_menu_controller.js +208 -228
  13. data/app/javascript/controllers/dropdown_menu_sub_controller.js +97 -110
  14. data/app/javascript/controllers/form_field_controller.js +16 -16
  15. data/app/javascript/controllers/hover_card_controller.js +71 -68
  16. data/app/javascript/controllers/loading_button_controller.js +10 -10
  17. data/app/javascript/controllers/popover_controller.js +78 -84
  18. data/app/javascript/controllers/progress_controller.js +11 -11
  19. data/app/javascript/controllers/radio_group_controller.js +74 -74
  20. data/app/javascript/controllers/select_controller.js +232 -246
  21. data/app/javascript/controllers/sidebar_controller.js +27 -26
  22. data/app/javascript/controllers/sidebar_trigger_controller.js +9 -12
  23. data/app/javascript/controllers/slider_controller.js +74 -73
  24. data/app/javascript/controllers/switch_controller.js +23 -22
  25. data/app/javascript/controllers/tabs_controller.js +61 -60
  26. data/app/javascript/controllers/theme_switcher_controller.js +27 -27
  27. data/app/javascript/controllers/toast_container_controller.js +31 -44
  28. data/app/javascript/controllers/toast_controller.js +18 -18
  29. data/app/javascript/controllers/toggle_controller.js +17 -16
  30. data/app/javascript/controllers/toggle_group_controller.js +17 -16
  31. data/app/javascript/controllers/tooltip_controller.js +77 -74
  32. data/app/javascript/shadcn_phlexcomponents.js +58 -58
  33. data/app/javascript/utils/command.js +334 -392
  34. data/app/javascript/utils/floating_ui.js +108 -147
  35. data/app/javascript/utils/index.js +190 -253
  36. data/app/stylesheets/date_picker.css +1 -1
  37. data/app/stylesheets/shadcn_phlexcomponents.css +173 -0
  38. data/app/typescript/controllers/combobox_controller.ts +0 -1
  39. data/app/typescript/controllers/date_picker_controller.ts +25 -7
  40. data/app/typescript/controllers/tooltip_controller.ts +1 -1
  41. data/app/typescript/utils/command.ts +0 -2
  42. data/app/typescript/utils/floating_ui.ts +11 -20
  43. data/app/typescript/utils/index.ts +0 -7
  44. data/lib/shadcn_phlexcomponents/components/accordion.rb +1 -1
  45. data/lib/shadcn_phlexcomponents/components/alert_dialog.rb +6 -6
  46. data/lib/shadcn_phlexcomponents/components/base.rb +2 -2
  47. data/lib/shadcn_phlexcomponents/components/combobox.rb +13 -13
  48. data/lib/shadcn_phlexcomponents/components/command.rb +13 -13
  49. data/lib/shadcn_phlexcomponents/components/date_picker.rb +18 -12
  50. data/lib/shadcn_phlexcomponents/components/date_range_picker.rb +7 -3
  51. data/lib/shadcn_phlexcomponents/components/dialog.rb +6 -6
  52. data/lib/shadcn_phlexcomponents/components/sheet.rb +7 -7
  53. data/lib/shadcn_phlexcomponents/components/toggle.rb +1 -1
  54. data/lib/shadcn_phlexcomponents/version.rb +1 -1
  55. metadata +2 -1
@@ -1,160 +1,121 @@
1
- import {
2
- computePosition,
3
- flip,
4
- shift,
5
- offset,
6
- autoUpdate,
7
- size,
8
- arrow,
9
- } from "@floating-ui/dom";
1
+ import { computePosition, flip, shift, offset, autoUpdate, size, arrow, limitShift, } from '@floating-ui/dom';
2
+ // https://github.com/radix-ui/primitives/blob/13e76f08f7afdea623aebfd3c55a7e41ae8d8078/packages/react/popper/src/popper.tsx
10
3
  const OPPOSITE_SIDE = {
11
- top: "bottom",
12
- right: "left",
13
- bottom: "top",
14
- left: "right",
4
+ top: 'bottom',
5
+ right: 'left',
6
+ bottom: 'top',
7
+ left: 'right',
15
8
  };
16
9
  const ARROW_TRANSFORM_ORIGIN = {
17
- top: "",
18
- right: "0 0",
19
- bottom: "center 0",
20
- left: "100% 0",
10
+ top: '',
11
+ right: '0 0',
12
+ bottom: 'center 0',
13
+ left: '100% 0',
21
14
  };
22
15
  const ARROW_TRANSFORM = {
23
- top: "translateY(100%)",
24
- right: "translateY(50%) rotate(90deg) translateX(-50%)",
25
- bottom: `rotate(180deg)`,
26
- left: "translateY(50%) rotate(-90deg) translateX(50%)",
16
+ top: 'translateY(100%)',
17
+ right: 'translateY(50%) rotate(90deg) translateX(-50%)',
18
+ bottom: `rotate(180deg)`,
19
+ left: 'translateY(50%) rotate(-90deg) translateX(50%)',
27
20
  };
28
- const initFloatingUi = ({
29
- referenceElement,
30
- floatingElement,
31
- side = "bottom",
32
- align = "center",
33
- sideOffset = 0,
34
- alignOffset = 0,
35
- arrowElement,
36
- }) => {
37
- let placement = `${side}-${align}`;
38
- placement = placement.replace(/-center/g, "");
39
- let arrowHeight = 0,
40
- arrowWidth = 0;
41
- if (arrowElement) {
42
- const rect = arrowElement.getBoundingClientRect();
43
- arrowWidth = rect.width;
44
- arrowHeight = rect.height;
45
- }
46
- const middleware = [
47
- transformOrigin({ arrowHeight, arrowWidth }),
48
- offset({ mainAxis: sideOffset, alignmentAxis: alignOffset }),
49
- size({
50
- apply: ({ elements, rects, availableWidth, availableHeight }) => {
51
- const { width: anchorWidth, height: anchorHeight } = rects.reference;
52
- const contentStyle = elements.floating.style;
53
- contentStyle.setProperty(
54
- "--radix-popper-available-width",
55
- `${availableWidth}px`,
56
- );
57
- contentStyle.setProperty(
58
- "--radix-popper-available-height",
59
- `${availableHeight}px`,
60
- );
61
- contentStyle.setProperty(
62
- "--radix-popper-anchor-width",
63
- `${anchorWidth}px`,
64
- );
65
- contentStyle.setProperty(
66
- "--radix-popper-anchor-height",
67
- `${anchorHeight}px`,
68
- );
69
- },
70
- }),
71
- ];
72
- const flipMiddleware = flip({
73
- // Ensure we flip to the perpendicular axis if it doesn't fit
74
- // on narrow viewports.
75
- crossAxis: "alignment",
76
- fallbackAxisSideDirection: "end", // or 'start'
77
- });
78
- const shiftMiddleware = shift();
79
- // Prioritize flip over shift for edge-aligned placements only.
80
- if (placement.includes("-")) {
81
- middleware.push(flipMiddleware, shiftMiddleware);
82
- } else {
83
- middleware.push(shiftMiddleware, flipMiddleware);
84
- }
85
- if (arrowElement) {
86
- middleware.push(arrow({ element: arrowElement, padding: 0 }));
87
- }
88
- return autoUpdate(referenceElement, floatingElement, () => {
89
- computePosition(referenceElement, floatingElement, {
90
- placement: placement,
91
- strategy: "fixed",
92
- middleware,
93
- }).then(({ middlewareData, x, y }) => {
94
- const arrowX = middlewareData.arrow?.x;
95
- const arrowY = middlewareData.arrow?.y;
96
- const cannotCenterArrow = middlewareData.arrow?.centerOffset !== 0;
97
- floatingElement.style.setProperty(
98
- "--radix-popper-transform-origin",
99
- `${middlewareData.transformOrigin?.x} ${middlewareData.transformOrigin?.y}`,
100
- );
101
- if (arrowElement) {
102
- const baseSide = OPPOSITE_SIDE[side];
103
- const arrowStyle = {
104
- position: "absolute",
105
- left: arrowX ? `${arrowX}px` : undefined,
106
- top: arrowY ? `${arrowY}px` : undefined,
107
- [baseSide]: 0,
108
- transformOrigin: ARROW_TRANSFORM_ORIGIN[side],
109
- transform: ARROW_TRANSFORM[side],
110
- visibility: cannotCenterArrow ? "hidden" : undefined,
111
- };
112
- Object.assign(arrowElement.style, arrowStyle);
113
- }
114
- Object.assign(floatingElement.style, {
115
- left: `${x}px`,
116
- top: `${y}px`,
117
- });
21
+ const initFloatingUi = ({ referenceElement, floatingElement, side = 'bottom', align = 'center', sideOffset = 0, alignOffset = 0, arrowElement, }) => {
22
+ let placement = `${side}-${align}`;
23
+ placement = placement.replace(/-center/g, '');
24
+ let arrowHeight = 0, arrowWidth = 0;
25
+ if (arrowElement) {
26
+ const rect = arrowElement.getBoundingClientRect();
27
+ arrowWidth = rect.width;
28
+ arrowHeight = rect.height;
29
+ }
30
+ const middleware = [
31
+ offset({ mainAxis: sideOffset + arrowHeight, alignmentAxis: alignOffset }),
32
+ shift({
33
+ mainAxis: true,
34
+ crossAxis: false,
35
+ limiter: limitShift(),
36
+ }),
37
+ flip({ crossAxis: 'alignment', fallbackAxisSideDirection: 'end' }),
38
+ transformOrigin({ arrowHeight, arrowWidth }),
39
+ size({
40
+ apply: ({ elements, rects, availableWidth, availableHeight }) => {
41
+ const { width: anchorWidth, height: anchorHeight } = rects.reference;
42
+ const contentStyle = elements.floating.style;
43
+ contentStyle.setProperty('--radix-popper-available-width', `${availableWidth}px`);
44
+ contentStyle.setProperty('--radix-popper-available-height', `${availableHeight}px`);
45
+ contentStyle.setProperty('--radix-popper-anchor-width', `${anchorWidth}px`);
46
+ contentStyle.setProperty('--radix-popper-anchor-height', `${anchorHeight}px`);
47
+ },
48
+ }),
49
+ arrowElement && arrow({ element: arrowElement, padding: 0 }),
50
+ ];
51
+ return autoUpdate(referenceElement, floatingElement, () => {
52
+ computePosition(referenceElement, floatingElement, {
53
+ placement: placement,
54
+ strategy: 'fixed',
55
+ middleware,
56
+ }).then(({ middlewareData, x, y }) => {
57
+ const arrowX = middlewareData.arrow?.x;
58
+ const arrowY = middlewareData.arrow?.y;
59
+ const cannotCenterArrow = middlewareData.arrow?.centerOffset !== 0;
60
+ floatingElement.style.setProperty('--radix-popper-transform-origin', `${middlewareData.transformOrigin?.x} ${middlewareData.transformOrigin?.y}`);
61
+ if (arrowElement) {
62
+ const baseSide = OPPOSITE_SIDE[side];
63
+ const arrowStyle = {
64
+ position: 'absolute',
65
+ left: arrowX ? `${arrowX}px` : undefined,
66
+ top: arrowY ? `${arrowY}px` : undefined,
67
+ [baseSide]: 0,
68
+ transformOrigin: ARROW_TRANSFORM_ORIGIN[side],
69
+ transform: ARROW_TRANSFORM[side],
70
+ visibility: cannotCenterArrow ? 'hidden' : undefined,
71
+ };
72
+ Object.assign(arrowElement.style, arrowStyle);
73
+ }
74
+ Object.assign(floatingElement.style, {
75
+ left: `${x}px`,
76
+ top: `${y}px`,
77
+ });
78
+ });
118
79
  });
119
- });
120
80
  };
121
81
  const transformOrigin = (options) => {
122
- return {
123
- name: "transformOrigin",
124
- options,
125
- fn(data) {
126
- const { placement, rects, middlewareData } = data;
127
- const cannotCenterArrow = middlewareData.arrow?.centerOffset !== 0;
128
- const isArrowHidden = cannotCenterArrow;
129
- const arrowWidth = isArrowHidden ? 0 : options.arrowWidth;
130
- const arrowHeight = isArrowHidden ? 0 : options.arrowHeight;
131
- const [placedSide, placedAlign] = getSideAndAlignFromPlacement(placement);
132
- const noArrowAlign = { start: "0%", center: "50%", end: "100%" }[
133
- placedAlign
134
- ];
135
- const arrowXCenter = (middlewareData.arrow?.x ?? 0) + arrowWidth / 2;
136
- const arrowYCenter = (middlewareData.arrow?.y ?? 0) + arrowHeight / 2;
137
- let x = "";
138
- let y = "";
139
- if (placedSide === "bottom") {
140
- x = isArrowHidden ? noArrowAlign : `${arrowXCenter}px`;
141
- y = `${-arrowHeight}px`;
142
- } else if (placedSide === "top") {
143
- x = isArrowHidden ? noArrowAlign : `${arrowXCenter}px`;
144
- y = `${rects.floating.height + arrowHeight}px`;
145
- } else if (placedSide === "right") {
146
- x = `${-arrowHeight}px`;
147
- y = isArrowHidden ? noArrowAlign : `${arrowYCenter}px`;
148
- } else if (placedSide === "left") {
149
- x = `${rects.floating.width + arrowHeight}px`;
150
- y = isArrowHidden ? noArrowAlign : `${arrowYCenter}px`;
151
- }
152
- return { data: { x, y } };
153
- },
154
- };
82
+ return {
83
+ name: 'transformOrigin',
84
+ options,
85
+ fn(data) {
86
+ const { placement, rects, middlewareData } = data;
87
+ const cannotCenterArrow = middlewareData.arrow?.centerOffset !== 0;
88
+ const isArrowHidden = cannotCenterArrow;
89
+ const arrowWidth = isArrowHidden ? 0 : options.arrowWidth;
90
+ const arrowHeight = isArrowHidden ? 0 : options.arrowHeight;
91
+ const [placedSide, placedAlign] = getSideAndAlignFromPlacement(placement);
92
+ const noArrowAlign = { start: '0%', center: '50%', end: '100%' }[placedAlign];
93
+ const arrowXCenter = (middlewareData.arrow?.x ?? 0) + arrowWidth / 2;
94
+ const arrowYCenter = (middlewareData.arrow?.y ?? 0) + arrowHeight / 2;
95
+ let x = '';
96
+ let y = '';
97
+ if (placedSide === 'bottom') {
98
+ x = isArrowHidden ? noArrowAlign : `${arrowXCenter}px`;
99
+ y = `${-arrowHeight}px`;
100
+ }
101
+ else if (placedSide === 'top') {
102
+ x = isArrowHidden ? noArrowAlign : `${arrowXCenter}px`;
103
+ y = `${rects.floating.height + arrowHeight}px`;
104
+ }
105
+ else if (placedSide === 'right') {
106
+ x = `${-arrowHeight}px`;
107
+ y = isArrowHidden ? noArrowAlign : `${arrowYCenter}px`;
108
+ }
109
+ else if (placedSide === 'left') {
110
+ x = `${rects.floating.width + arrowHeight}px`;
111
+ y = isArrowHidden ? noArrowAlign : `${arrowYCenter}px`;
112
+ }
113
+ return { data: { x, y } };
114
+ },
115
+ };
155
116
  };
156
117
  function getSideAndAlignFromPlacement(placement) {
157
- const [side, align = "center"] = placement.split("-");
158
- return [side, align];
118
+ const [side, align = 'center'] = placement.split('-');
119
+ return [side, align];
159
120
  }
160
121
  export { initFloatingUi };