shadcn_phlexcomponents 0.1.18 → 0.1.19

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 (128) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +321 -23
  3. data/app/javascript/controllers/accordion_controller.js +101 -90
  4. data/app/javascript/controllers/alert_dialog_controller.js +5 -4
  5. data/app/javascript/controllers/avatar_controller.js +12 -11
  6. data/app/javascript/controllers/checkbox_controller.js +26 -26
  7. data/app/javascript/controllers/collapsible_controller.js +35 -36
  8. data/app/javascript/controllers/combobox_controller.js +262 -231
  9. data/app/javascript/controllers/command_controller.js +205 -184
  10. data/app/javascript/controllers/date_picker_controller.js +252 -253
  11. data/app/javascript/controllers/date_range_picker_controller.js +189 -200
  12. data/app/javascript/controllers/dialog_controller.js +79 -78
  13. data/app/javascript/controllers/dropdown_menu_controller.js +229 -208
  14. data/app/javascript/controllers/dropdown_menu_sub_controller.js +111 -97
  15. data/app/javascript/controllers/form_field_controller.js +17 -16
  16. data/app/javascript/controllers/hover_card_controller.js +69 -71
  17. data/app/javascript/controllers/loading_button_controller.js +11 -10
  18. data/app/javascript/controllers/popover_controller.js +85 -78
  19. data/app/javascript/controllers/progress_controller.js +12 -11
  20. data/app/javascript/controllers/radio_group_controller.js +75 -74
  21. data/app/javascript/controllers/select_controller.js +247 -232
  22. data/app/javascript/controllers/sidebar_controller.js +26 -27
  23. data/app/javascript/controllers/sidebar_trigger_controller.js +12 -9
  24. data/app/javascript/controllers/slider_controller.js +74 -74
  25. data/app/javascript/controllers/switch_controller.js +23 -23
  26. data/app/javascript/controllers/tabs_controller.js +61 -61
  27. data/app/javascript/controllers/theme_switcher_controller.js +28 -27
  28. data/app/javascript/controllers/toast_container_controller.js +45 -31
  29. data/app/javascript/controllers/toast_controller.js +19 -18
  30. data/app/javascript/controllers/toggle_controller.js +17 -17
  31. data/app/javascript/controllers/toggle_group_controller.js +17 -17
  32. data/app/javascript/controllers/tooltip_controller.js +75 -77
  33. data/app/javascript/shadcn_phlexcomponents.js +27 -60
  34. data/app/javascript/utils/command.js +390 -334
  35. data/app/javascript/utils/floating_ui.js +139 -107
  36. data/app/javascript/utils/index.js +253 -190
  37. data/app/typescript/controllers/accordion_controller.ts +2 -0
  38. data/app/typescript/controllers/alert_dialog_controller.ts +2 -0
  39. data/app/typescript/controllers/avatar_controller.ts +2 -0
  40. data/app/typescript/controllers/checkbox_controller.ts +2 -0
  41. data/app/typescript/controllers/collapsible_controller.ts +2 -0
  42. data/app/typescript/controllers/combobox_controller.ts +2 -0
  43. data/app/typescript/controllers/command_controller.ts +2 -0
  44. data/app/typescript/controllers/date_picker_controller.ts +2 -0
  45. data/app/typescript/controllers/date_range_picker_controller.ts +2 -0
  46. data/app/typescript/controllers/dialog_controller.ts +2 -0
  47. data/app/typescript/controllers/dropdown_menu_controller.ts +2 -0
  48. data/app/typescript/controllers/dropdown_menu_sub_controller.ts +2 -0
  49. data/app/typescript/controllers/form_field_controller.ts +2 -0
  50. data/app/typescript/controllers/hover_card_controller.ts +2 -0
  51. data/app/typescript/controllers/loading_button_controller.ts +2 -0
  52. data/app/typescript/controllers/popover_controller.ts +2 -0
  53. data/app/typescript/controllers/progress_controller.ts +2 -0
  54. data/app/typescript/controllers/radio_group_controller.ts +2 -0
  55. data/app/typescript/controllers/select_controller.ts +2 -0
  56. data/app/typescript/controllers/slider_controller.ts +2 -0
  57. data/app/typescript/controllers/switch_controller.ts +2 -0
  58. data/app/typescript/controllers/tabs_controller.ts +2 -0
  59. data/app/typescript/controllers/theme_switcher_controller.ts +2 -0
  60. data/app/typescript/controllers/toast_container_controller.ts +2 -0
  61. data/app/typescript/controllers/toast_controller.ts +2 -0
  62. data/app/typescript/controllers/toggle_controller.ts +2 -0
  63. data/app/typescript/controllers/toggle_group_controller.ts +2 -0
  64. data/app/typescript/controllers/tooltip_controller.ts +2 -0
  65. data/app/typescript/shadcn_phlexcomponents.ts +27 -61
  66. data/app/typescript/utils/index.ts +7 -0
  67. data/lib/install/upgrade_shadcn_phlexcomponents.rb +28 -0
  68. data/lib/shadcn_phlexcomponents/components/accordion.rb +55 -12
  69. data/lib/shadcn_phlexcomponents/components/alert.rb +35 -16
  70. data/lib/shadcn_phlexcomponents/components/alert_dialog.rb +52 -12
  71. data/lib/shadcn_phlexcomponents/components/aspect_ratio.rb +33 -2
  72. data/lib/shadcn_phlexcomponents/components/avatar.rb +24 -7
  73. data/lib/shadcn_phlexcomponents/components/badge.rb +23 -18
  74. data/lib/shadcn_phlexcomponents/components/breadcrumb.rb +46 -6
  75. data/lib/shadcn_phlexcomponents/components/button.rb +32 -27
  76. data/lib/shadcn_phlexcomponents/components/card.rb +59 -10
  77. data/lib/shadcn_phlexcomponents/components/checkbox.rb +51 -30
  78. data/lib/shadcn_phlexcomponents/components/checkbox_group.rb +24 -4
  79. data/lib/shadcn_phlexcomponents/components/combobox.rb +212 -69
  80. data/lib/shadcn_phlexcomponents/components/command.rb +156 -52
  81. data/lib/shadcn_phlexcomponents/components/date_picker.rb +134 -48
  82. data/lib/shadcn_phlexcomponents/components/date_range_picker.rb +20 -42
  83. data/lib/shadcn_phlexcomponents/components/dialog.rb +80 -26
  84. data/lib/shadcn_phlexcomponents/components/dropdown_menu.rb +74 -25
  85. data/lib/shadcn_phlexcomponents/components/dropdown_menu_sub.rb +52 -24
  86. data/lib/shadcn_phlexcomponents/components/form/form_checkbox.rb +1 -1
  87. data/lib/shadcn_phlexcomponents/components/form/form_checkbox_group.rb +1 -1
  88. data/lib/shadcn_phlexcomponents/components/form/form_combobox.rb +1 -1
  89. data/lib/shadcn_phlexcomponents/components/form/form_date_picker.rb +1 -1
  90. data/lib/shadcn_phlexcomponents/components/form/form_date_range_picker.rb +1 -1
  91. data/lib/shadcn_phlexcomponents/components/form/form_error.rb +8 -1
  92. data/lib/shadcn_phlexcomponents/components/form/form_helpers.rb +3 -2
  93. data/lib/shadcn_phlexcomponents/components/form/form_hint.rb +8 -1
  94. data/lib/shadcn_phlexcomponents/components/form/form_input.rb +1 -1
  95. data/lib/shadcn_phlexcomponents/components/form/form_radio_group.rb +1 -1
  96. data/lib/shadcn_phlexcomponents/components/form/form_select.rb +1 -1
  97. data/lib/shadcn_phlexcomponents/components/form/form_slider.rb +1 -1
  98. data/lib/shadcn_phlexcomponents/components/form/form_switch.rb +1 -1
  99. data/lib/shadcn_phlexcomponents/components/form/form_textarea.rb +1 -1
  100. data/lib/shadcn_phlexcomponents/components/form.rb +22 -6
  101. data/lib/shadcn_phlexcomponents/components/hover_card.rb +48 -18
  102. data/lib/shadcn_phlexcomponents/components/input.rb +13 -8
  103. data/lib/shadcn_phlexcomponents/components/label.rb +9 -4
  104. data/lib/shadcn_phlexcomponents/components/link.rb +8 -1
  105. data/lib/shadcn_phlexcomponents/components/pagination.rb +34 -6
  106. data/lib/shadcn_phlexcomponents/components/popover.rb +43 -13
  107. data/lib/shadcn_phlexcomponents/components/progress.rb +37 -6
  108. data/lib/shadcn_phlexcomponents/components/radio_group.rb +41 -15
  109. data/lib/shadcn_phlexcomponents/components/select.rb +99 -42
  110. data/lib/shadcn_phlexcomponents/components/separator.rb +9 -4
  111. data/lib/shadcn_phlexcomponents/components/sheet.rb +87 -21
  112. data/lib/shadcn_phlexcomponents/components/skeleton.rb +8 -1
  113. data/lib/shadcn_phlexcomponents/components/switch.rb +45 -17
  114. data/lib/shadcn_phlexcomponents/components/table.rb +84 -17
  115. data/lib/shadcn_phlexcomponents/components/tabs.rb +36 -12
  116. data/lib/shadcn_phlexcomponents/components/textarea.rb +12 -7
  117. data/lib/shadcn_phlexcomponents/components/toast.rb +46 -20
  118. data/lib/shadcn_phlexcomponents/components/toast_container.rb +19 -14
  119. data/lib/shadcn_phlexcomponents/components/toggle.rb +28 -23
  120. data/lib/shadcn_phlexcomponents/components/tooltip.rb +49 -14
  121. data/lib/shadcn_phlexcomponents/configuration.rb +46 -0
  122. data/lib/shadcn_phlexcomponents/initializers/shadcn_phlexcomponents.rb +28 -0
  123. data/lib/shadcn_phlexcomponents/version.rb +1 -1
  124. data/lib/shadcn_phlexcomponents.rb +12 -1
  125. data/lib/tasks/upgrade.rake +10 -0
  126. metadata +15 -14
  127. data/app/typescript/controllers/sidebar_controller.ts +0 -39
  128. data/app/typescript/controllers/sidebar_trigger_controller.ts +0 -21
@@ -1,121 +1,153 @@
1
- import { computePosition, flip, shift, offset, autoUpdate, size, arrow, limitShift, } from '@floating-ui/dom';
1
+ import {
2
+ computePosition,
3
+ flip,
4
+ shift,
5
+ offset,
6
+ autoUpdate,
7
+ size,
8
+ arrow,
9
+ limitShift,
10
+ } from "@floating-ui/dom";
2
11
  // https://github.com/radix-ui/primitives/blob/13e76f08f7afdea623aebfd3c55a7e41ae8d8078/packages/react/popper/src/popper.tsx
3
12
  const OPPOSITE_SIDE = {
4
- top: 'bottom',
5
- right: 'left',
6
- bottom: 'top',
7
- left: 'right',
13
+ top: "bottom",
14
+ right: "left",
15
+ bottom: "top",
16
+ left: "right",
8
17
  };
9
18
  const ARROW_TRANSFORM_ORIGIN = {
10
- top: '',
11
- right: '0 0',
12
- bottom: 'center 0',
13
- left: '100% 0',
19
+ top: "",
20
+ right: "0 0",
21
+ bottom: "center 0",
22
+ left: "100% 0",
14
23
  };
15
24
  const ARROW_TRANSFORM = {
16
- top: 'translateY(100%)',
17
- right: 'translateY(50%) rotate(90deg) translateX(-50%)',
18
- bottom: `rotate(180deg)`,
19
- left: 'translateY(50%) rotate(-90deg) translateX(50%)',
25
+ top: "translateY(100%)",
26
+ right: "translateY(50%) rotate(90deg) translateX(-50%)",
27
+ bottom: `rotate(180deg)`,
28
+ left: "translateY(50%) rotate(-90deg) translateX(50%)",
20
29
  };
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
- });
30
+ const initFloatingUi = ({
31
+ referenceElement,
32
+ floatingElement,
33
+ side = "bottom",
34
+ align = "center",
35
+ sideOffset = 0,
36
+ alignOffset = 0,
37
+ arrowElement,
38
+ }) => {
39
+ let placement = `${side}-${align}`;
40
+ placement = placement.replace(/-center/g, "");
41
+ let arrowHeight = 0,
42
+ arrowWidth = 0;
43
+ if (arrowElement) {
44
+ const rect = arrowElement.getBoundingClientRect();
45
+ arrowWidth = rect.width;
46
+ arrowHeight = rect.height;
47
+ }
48
+ const middleware = [
49
+ offset({ mainAxis: sideOffset + arrowHeight, alignmentAxis: alignOffset }),
50
+ shift({
51
+ mainAxis: true,
52
+ crossAxis: false,
53
+ limiter: limitShift(),
54
+ }),
55
+ flip({ crossAxis: "alignment", fallbackAxisSideDirection: "end" }),
56
+ transformOrigin({ arrowHeight, arrowWidth }),
57
+ size({
58
+ apply: ({ elements, rects, availableWidth, availableHeight }) => {
59
+ const { width: anchorWidth, height: anchorHeight } = rects.reference;
60
+ const contentStyle = elements.floating.style;
61
+ contentStyle.setProperty(
62
+ "--radix-popper-available-width",
63
+ `${availableWidth}px`,
64
+ );
65
+ contentStyle.setProperty(
66
+ "--radix-popper-available-height",
67
+ `${availableHeight}px`,
68
+ );
69
+ contentStyle.setProperty(
70
+ "--radix-popper-anchor-width",
71
+ `${anchorWidth}px`,
72
+ );
73
+ contentStyle.setProperty(
74
+ "--radix-popper-anchor-height",
75
+ `${anchorHeight}px`,
76
+ );
77
+ },
78
+ }),
79
+ arrowElement && arrow({ element: arrowElement, padding: 0 }),
80
+ ];
81
+ return autoUpdate(referenceElement, floatingElement, () => {
82
+ computePosition(referenceElement, floatingElement, {
83
+ placement: placement,
84
+ strategy: "fixed",
85
+ middleware,
86
+ }).then(({ middlewareData, x, y }) => {
87
+ const arrowX = middlewareData.arrow?.x;
88
+ const arrowY = middlewareData.arrow?.y;
89
+ const cannotCenterArrow = middlewareData.arrow?.centerOffset !== 0;
90
+ floatingElement.style.setProperty(
91
+ "--radix-popper-transform-origin",
92
+ `${middlewareData.transformOrigin?.x} ${middlewareData.transformOrigin?.y}`,
93
+ );
94
+ if (arrowElement) {
95
+ const baseSide = OPPOSITE_SIDE[side];
96
+ const arrowStyle = {
97
+ position: "absolute",
98
+ left: arrowX ? `${arrowX}px` : undefined,
99
+ top: arrowY ? `${arrowY}px` : undefined,
100
+ [baseSide]: 0,
101
+ transformOrigin: ARROW_TRANSFORM_ORIGIN[side],
102
+ transform: ARROW_TRANSFORM[side],
103
+ visibility: cannotCenterArrow ? "hidden" : undefined,
104
+ };
105
+ Object.assign(arrowElement.style, arrowStyle);
106
+ }
107
+ Object.assign(floatingElement.style, {
108
+ left: `${x}px`,
109
+ top: `${y}px`,
110
+ });
79
111
  });
112
+ });
80
113
  };
81
114
  const transformOrigin = (options) => {
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
- };
115
+ return {
116
+ name: "transformOrigin",
117
+ options,
118
+ fn(data) {
119
+ const { placement, rects, middlewareData } = data;
120
+ const cannotCenterArrow = middlewareData.arrow?.centerOffset !== 0;
121
+ const isArrowHidden = cannotCenterArrow;
122
+ const arrowWidth = isArrowHidden ? 0 : options.arrowWidth;
123
+ const arrowHeight = isArrowHidden ? 0 : options.arrowHeight;
124
+ const [placedSide, placedAlign] = getSideAndAlignFromPlacement(placement);
125
+ const noArrowAlign = { start: "0%", center: "50%", end: "100%" }[
126
+ placedAlign
127
+ ];
128
+ const arrowXCenter = (middlewareData.arrow?.x ?? 0) + arrowWidth / 2;
129
+ const arrowYCenter = (middlewareData.arrow?.y ?? 0) + arrowHeight / 2;
130
+ let x = "";
131
+ let y = "";
132
+ if (placedSide === "bottom") {
133
+ x = isArrowHidden ? noArrowAlign : `${arrowXCenter}px`;
134
+ y = `${-arrowHeight}px`;
135
+ } else if (placedSide === "top") {
136
+ x = isArrowHidden ? noArrowAlign : `${arrowXCenter}px`;
137
+ y = `${rects.floating.height + arrowHeight}px`;
138
+ } else if (placedSide === "right") {
139
+ x = `${-arrowHeight}px`;
140
+ y = isArrowHidden ? noArrowAlign : `${arrowYCenter}px`;
141
+ } else if (placedSide === "left") {
142
+ x = `${rects.floating.width + arrowHeight}px`;
143
+ y = isArrowHidden ? noArrowAlign : `${arrowYCenter}px`;
144
+ }
145
+ return { data: { x, y } };
146
+ },
147
+ };
116
148
  };
117
149
  function getSideAndAlignFromPlacement(placement) {
118
- const [side, align = 'center'] = placement.split('-');
119
- return [side, align];
150
+ const [side, align = "center"] = placement.split("-");
151
+ return [side, align];
120
152
  }
121
153
  export { initFloatingUi };