shadcn_phlexcomponents 0.1.17 → 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 (130) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +321 -23
  3. data/app/javascript/controllers/accordion_controller.js +1 -0
  4. data/app/javascript/controllers/alert_dialog_controller.js +1 -0
  5. data/app/javascript/controllers/avatar_controller.js +1 -0
  6. data/app/javascript/controllers/checkbox_controller.js +1 -0
  7. data/app/javascript/controllers/collapsible_controller.js +1 -0
  8. data/app/javascript/controllers/combobox_controller.js +1 -1
  9. data/app/javascript/controllers/command_controller.js +1 -0
  10. data/app/javascript/controllers/date_picker_controller.js +21 -5
  11. data/app/javascript/controllers/date_range_picker_controller.js +1 -0
  12. data/app/javascript/controllers/dialog_controller.js +1 -0
  13. data/app/javascript/controllers/dropdown_menu_controller.js +1 -0
  14. data/app/javascript/controllers/dropdown_menu_sub_controller.js +1 -0
  15. data/app/javascript/controllers/form_field_controller.js +1 -0
  16. data/app/javascript/controllers/hover_card_controller.js +1 -0
  17. data/app/javascript/controllers/loading_button_controller.js +1 -0
  18. data/app/javascript/controllers/popover_controller.js +1 -0
  19. data/app/javascript/controllers/progress_controller.js +1 -0
  20. data/app/javascript/controllers/radio_group_controller.js +1 -0
  21. data/app/javascript/controllers/select_controller.js +1 -0
  22. data/app/javascript/controllers/slider_controller.js +1 -0
  23. data/app/javascript/controllers/switch_controller.js +1 -0
  24. data/app/javascript/controllers/tabs_controller.js +1 -0
  25. data/app/javascript/controllers/theme_switcher_controller.js +1 -0
  26. data/app/javascript/controllers/toast_container_controller.js +1 -0
  27. data/app/javascript/controllers/toast_controller.js +1 -0
  28. data/app/javascript/controllers/toggle_controller.js +1 -0
  29. data/app/javascript/controllers/toggle_group_controller.js +1 -0
  30. data/app/javascript/controllers/tooltip_controller.js +2 -1
  31. data/app/javascript/shadcn_phlexcomponents.js +27 -60
  32. data/app/javascript/utils/command.js +0 -2
  33. data/app/javascript/utils/floating_ui.js +10 -17
  34. data/app/stylesheets/date_picker.css +1 -1
  35. data/app/stylesheets/shadcn_phlexcomponents.css +173 -0
  36. data/app/typescript/controllers/accordion_controller.ts +2 -0
  37. data/app/typescript/controllers/alert_dialog_controller.ts +2 -0
  38. data/app/typescript/controllers/avatar_controller.ts +2 -0
  39. data/app/typescript/controllers/checkbox_controller.ts +2 -0
  40. data/app/typescript/controllers/collapsible_controller.ts +2 -0
  41. data/app/typescript/controllers/combobox_controller.ts +2 -1
  42. data/app/typescript/controllers/command_controller.ts +2 -0
  43. data/app/typescript/controllers/date_picker_controller.ts +27 -7
  44. data/app/typescript/controllers/date_range_picker_controller.ts +2 -0
  45. data/app/typescript/controllers/dialog_controller.ts +2 -0
  46. data/app/typescript/controllers/dropdown_menu_controller.ts +2 -0
  47. data/app/typescript/controllers/dropdown_menu_sub_controller.ts +2 -0
  48. data/app/typescript/controllers/form_field_controller.ts +2 -0
  49. data/app/typescript/controllers/hover_card_controller.ts +2 -0
  50. data/app/typescript/controllers/loading_button_controller.ts +2 -0
  51. data/app/typescript/controllers/popover_controller.ts +2 -0
  52. data/app/typescript/controllers/progress_controller.ts +2 -0
  53. data/app/typescript/controllers/radio_group_controller.ts +2 -0
  54. data/app/typescript/controllers/select_controller.ts +2 -0
  55. data/app/typescript/controllers/slider_controller.ts +2 -0
  56. data/app/typescript/controllers/switch_controller.ts +2 -0
  57. data/app/typescript/controllers/tabs_controller.ts +2 -0
  58. data/app/typescript/controllers/theme_switcher_controller.ts +2 -0
  59. data/app/typescript/controllers/toast_container_controller.ts +2 -0
  60. data/app/typescript/controllers/toast_controller.ts +2 -0
  61. data/app/typescript/controllers/toggle_controller.ts +2 -0
  62. data/app/typescript/controllers/toggle_group_controller.ts +2 -0
  63. data/app/typescript/controllers/tooltip_controller.ts +3 -1
  64. data/app/typescript/shadcn_phlexcomponents.ts +27 -61
  65. data/app/typescript/utils/command.ts +0 -2
  66. data/app/typescript/utils/floating_ui.ts +11 -20
  67. data/app/typescript/utils/index.ts +1 -1
  68. data/lib/install/upgrade_shadcn_phlexcomponents.rb +28 -0
  69. data/lib/shadcn_phlexcomponents/components/accordion.rb +56 -13
  70. data/lib/shadcn_phlexcomponents/components/alert.rb +35 -16
  71. data/lib/shadcn_phlexcomponents/components/alert_dialog.rb +58 -18
  72. data/lib/shadcn_phlexcomponents/components/aspect_ratio.rb +33 -2
  73. data/lib/shadcn_phlexcomponents/components/avatar.rb +24 -7
  74. data/lib/shadcn_phlexcomponents/components/badge.rb +23 -18
  75. data/lib/shadcn_phlexcomponents/components/base.rb +2 -2
  76. data/lib/shadcn_phlexcomponents/components/breadcrumb.rb +46 -6
  77. data/lib/shadcn_phlexcomponents/components/button.rb +32 -27
  78. data/lib/shadcn_phlexcomponents/components/card.rb +59 -10
  79. data/lib/shadcn_phlexcomponents/components/checkbox.rb +51 -30
  80. data/lib/shadcn_phlexcomponents/components/checkbox_group.rb +24 -4
  81. data/lib/shadcn_phlexcomponents/components/combobox.rb +224 -81
  82. data/lib/shadcn_phlexcomponents/components/command.rb +167 -63
  83. data/lib/shadcn_phlexcomponents/components/date_picker.rb +140 -48
  84. data/lib/shadcn_phlexcomponents/components/date_range_picker.rb +26 -44
  85. data/lib/shadcn_phlexcomponents/components/dialog.rb +86 -32
  86. data/lib/shadcn_phlexcomponents/components/dropdown_menu.rb +74 -25
  87. data/lib/shadcn_phlexcomponents/components/dropdown_menu_sub.rb +52 -24
  88. data/lib/shadcn_phlexcomponents/components/form/form_checkbox.rb +1 -1
  89. data/lib/shadcn_phlexcomponents/components/form/form_checkbox_group.rb +1 -1
  90. data/lib/shadcn_phlexcomponents/components/form/form_combobox.rb +1 -1
  91. data/lib/shadcn_phlexcomponents/components/form/form_date_picker.rb +1 -1
  92. data/lib/shadcn_phlexcomponents/components/form/form_date_range_picker.rb +1 -1
  93. data/lib/shadcn_phlexcomponents/components/form/form_error.rb +8 -1
  94. data/lib/shadcn_phlexcomponents/components/form/form_helpers.rb +3 -2
  95. data/lib/shadcn_phlexcomponents/components/form/form_hint.rb +8 -1
  96. data/lib/shadcn_phlexcomponents/components/form/form_input.rb +1 -1
  97. data/lib/shadcn_phlexcomponents/components/form/form_radio_group.rb +1 -1
  98. data/lib/shadcn_phlexcomponents/components/form/form_select.rb +1 -1
  99. data/lib/shadcn_phlexcomponents/components/form/form_slider.rb +1 -1
  100. data/lib/shadcn_phlexcomponents/components/form/form_switch.rb +1 -1
  101. data/lib/shadcn_phlexcomponents/components/form/form_textarea.rb +1 -1
  102. data/lib/shadcn_phlexcomponents/components/form.rb +22 -6
  103. data/lib/shadcn_phlexcomponents/components/hover_card.rb +48 -18
  104. data/lib/shadcn_phlexcomponents/components/input.rb +13 -8
  105. data/lib/shadcn_phlexcomponents/components/label.rb +9 -4
  106. data/lib/shadcn_phlexcomponents/components/link.rb +8 -1
  107. data/lib/shadcn_phlexcomponents/components/pagination.rb +34 -6
  108. data/lib/shadcn_phlexcomponents/components/popover.rb +43 -13
  109. data/lib/shadcn_phlexcomponents/components/progress.rb +37 -6
  110. data/lib/shadcn_phlexcomponents/components/radio_group.rb +41 -15
  111. data/lib/shadcn_phlexcomponents/components/select.rb +99 -42
  112. data/lib/shadcn_phlexcomponents/components/separator.rb +9 -4
  113. data/lib/shadcn_phlexcomponents/components/sheet.rb +94 -28
  114. data/lib/shadcn_phlexcomponents/components/skeleton.rb +8 -1
  115. data/lib/shadcn_phlexcomponents/components/switch.rb +45 -17
  116. data/lib/shadcn_phlexcomponents/components/table.rb +84 -17
  117. data/lib/shadcn_phlexcomponents/components/tabs.rb +36 -12
  118. data/lib/shadcn_phlexcomponents/components/textarea.rb +12 -7
  119. data/lib/shadcn_phlexcomponents/components/toast.rb +46 -20
  120. data/lib/shadcn_phlexcomponents/components/toast_container.rb +19 -14
  121. data/lib/shadcn_phlexcomponents/components/toggle.rb +29 -24
  122. data/lib/shadcn_phlexcomponents/components/tooltip.rb +49 -14
  123. data/lib/shadcn_phlexcomponents/configuration.rb +46 -0
  124. data/lib/shadcn_phlexcomponents/initializers/shadcn_phlexcomponents.rb +28 -0
  125. data/lib/shadcn_phlexcomponents/version.rb +1 -1
  126. data/lib/shadcn_phlexcomponents.rb +12 -1
  127. data/lib/tasks/upgrade.rake +10 -0
  128. metadata +16 -14
  129. data/app/typescript/controllers/sidebar_controller.ts +0 -39
  130. data/app/typescript/controllers/sidebar_trigger_controller.ts +0 -21
@@ -1,5 +1,6 @@
1
1
  import { Controller } from "@hotwired/stimulus";
2
2
  const ToggleController = class extends Controller {
3
+ static name = "toggle-group";
3
4
  // values
4
5
  static values = {
5
6
  isOn: Boolean,
@@ -3,6 +3,7 @@ import { useHover } from "stimulus-use";
3
3
  import { initFloatingUi } from "../utils/floating_ui";
4
4
  import { showContent, hideContent } from "../utils";
5
5
  const TooltipController = class extends Controller {
6
+ static name = "tooltip";
6
7
  // targets
7
8
  static targets = ["trigger", "content", "contentContainer", "arrow"];
8
9
  // values
@@ -46,7 +47,7 @@ const TooltipController = class extends Controller {
46
47
  arrowElement: this.arrowTarget,
47
48
  side: this.contentTarget.dataset.side,
48
49
  align: this.contentTarget.dataset.align,
49
- sideOffset: 8,
50
+ sideOffset: 4,
50
51
  });
51
52
  } else {
52
53
  hideContent({
@@ -1,60 +1,27 @@
1
- import { AccordionController } from "./controllers/accordion_controller";
2
- import { AlertDialogController } from "./controllers/alert_dialog_controller";
3
- import { AvatarController } from "./controllers/avatar_controller";
4
- import { CheckboxController } from "./controllers/checkbox_controller";
5
- import { CollapsibleController } from "./controllers/collapsible_controller";
6
- import { ComboboxController } from "./controllers/combobox_controller";
7
- import { CommandController } from "./controllers/command_controller";
8
- import { DatePickerController } from "./controllers/date_picker_controller";
9
- import { DateRangePickerController } from "./controllers/date_range_picker_controller";
10
- import { DialogController } from "./controllers/dialog_controller";
11
- import { DropdownMenuController } from "./controllers/dropdown_menu_controller";
12
- import { DropdownMenuSubController } from "./controllers/dropdown_menu_sub_controller";
13
- import { FormFieldController } from "./controllers/form_field_controller";
14
- import { HoverCardController } from "./controllers/hover_card_controller";
15
- import { LoadingButtonController } from "./controllers/loading_button_controller";
16
- import { PopoverController } from "./controllers/popover_controller";
17
- import { ProgressController } from "./controllers/progress_controller";
18
- import { RadioGroupController } from "./controllers/radio_group_controller";
19
- import { SelectController } from "./controllers/select_controller";
20
- import SidebarController from "./controllers/sidebar_controller";
21
- import SidebarTriggerController from "./controllers/sidebar_trigger_controller";
22
- import { SliderController } from "./controllers/slider_controller";
23
- import { SwitchController } from "./controllers/switch_controller";
24
- import { TabsController } from "./controllers/tabs_controller";
25
- import { ThemeSwitcherController } from "./controllers/theme_switcher_controller";
26
- import { ToastContainerController } from "./controllers/toast_container_controller";
27
- import { ToastController } from "./controllers/toast_controller";
28
- import { ToggleController } from "./controllers/toggle_controller";
29
- import { TooltipController } from "./controllers/tooltip_controller";
30
- export default {
31
- accordion: AccordionController,
32
- "alert-dialog": AlertDialogController,
33
- avatar: AvatarController,
34
- checkbox: CheckboxController,
35
- collapsible: CollapsibleController,
36
- combobox: ComboboxController,
37
- command: CommandController,
38
- "date-picker": DatePickerController,
39
- "date-range-picker": DateRangePickerController,
40
- dialog: DialogController,
41
- "dropdown-menu": DropdownMenuController,
42
- "dropdown-menu-sub": DropdownMenuSubController,
43
- "form-field": FormFieldController,
44
- "hover-card": HoverCardController,
45
- "loading-button": LoadingButtonController,
46
- popover: PopoverController,
47
- progress: ProgressController,
48
- "radio-group": RadioGroupController,
49
- select: SelectController,
50
- sidebar: SidebarController,
51
- "sidebar-trigger": SidebarTriggerController,
52
- slider: SliderController,
53
- switch: SwitchController,
54
- tabs: TabsController,
55
- "theme-switcher": ThemeSwitcherController,
56
- "toast-container": ToastContainerController,
57
- toast: ToastController,
58
- toggle: ToggleController,
59
- tooltip: TooltipController,
60
- };
1
+ export { AccordionController } from "./controllers/accordion_controller";
2
+ export { AlertDialogController } from "./controllers/alert_dialog_controller";
3
+ export { AvatarController } from "./controllers/avatar_controller";
4
+ export { CheckboxController } from "./controllers/checkbox_controller";
5
+ export { CollapsibleController } from "./controllers/collapsible_controller";
6
+ export { ComboboxController } from "./controllers/combobox_controller";
7
+ export { CommandController } from "./controllers/command_controller";
8
+ export { DatePickerController } from "./controllers/date_picker_controller";
9
+ export { DateRangePickerController } from "./controllers/date_range_picker_controller";
10
+ export { DialogController } from "./controllers/dialog_controller";
11
+ export { DropdownMenuController } from "./controllers/dropdown_menu_controller";
12
+ export { DropdownMenuSubController } from "./controllers/dropdown_menu_sub_controller";
13
+ export { FormFieldController } from "./controllers/form_field_controller";
14
+ export { HoverCardController } from "./controllers/hover_card_controller";
15
+ export { LoadingButtonController } from "./controllers/loading_button_controller";
16
+ export { PopoverController } from "./controllers/popover_controller";
17
+ export { ProgressController } from "./controllers/progress_controller";
18
+ export { RadioGroupController } from "./controllers/radio_group_controller";
19
+ export { SelectController } from "./controllers/select_controller";
20
+ export { SliderController } from "./controllers/slider_controller";
21
+ export { SwitchController } from "./controllers/switch_controller";
22
+ export { TabsController } from "./controllers/tabs_controller";
23
+ export { ThemeSwitcherController } from "./controllers/theme_switcher_controller";
24
+ export { ToastContainerController } from "./controllers/toast_container_controller";
25
+ export { ToastController } from "./controllers/toast_controller";
26
+ export { ToggleController } from "./controllers/toggle_controller";
27
+ export { TooltipController } from "./controllers/tooltip_controller";
@@ -262,7 +262,6 @@ const performRemoteSearch = async (controller, query) => {
262
262
  }
263
263
  };
264
264
  const renderRemoteResults = (controller, data) => {
265
- console.log("data", data);
266
265
  data.forEach((item) => {
267
266
  const tempDiv = document.createElement("div");
268
267
  tempDiv.innerHTML = item.html;
@@ -322,7 +321,6 @@ const renderRemoteResults = (controller, data) => {
322
321
  ),
323
322
  );
324
323
  controller.highlightItemByIndex(0);
325
- console.log("controller.filteredItems", controller.filteredItems);
326
324
  if (controller.filteredItems.length > 0) {
327
325
  hideEmpty(controller);
328
326
  } else {
@@ -6,7 +6,9 @@ import {
6
6
  autoUpdate,
7
7
  size,
8
8
  arrow,
9
+ limitShift,
9
10
  } from "@floating-ui/dom";
11
+ // https://github.com/radix-ui/primitives/blob/13e76f08f7afdea623aebfd3c55a7e41ae8d8078/packages/react/popper/src/popper.tsx
10
12
  const OPPOSITE_SIDE = {
11
13
  top: "bottom",
12
14
  right: "left",
@@ -44,8 +46,14 @@ const initFloatingUi = ({
44
46
  arrowHeight = rect.height;
45
47
  }
46
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" }),
47
56
  transformOrigin({ arrowHeight, arrowWidth }),
48
- offset({ mainAxis: sideOffset, alignmentAxis: alignOffset }),
49
57
  size({
50
58
  apply: ({ elements, rects, availableWidth, availableHeight }) => {
51
59
  const { width: anchorWidth, height: anchorHeight } = rects.reference;
@@ -68,23 +76,8 @@ const initFloatingUi = ({
68
76
  );
69
77
  },
70
78
  }),
79
+ arrowElement && arrow({ element: arrowElement, padding: 0 }),
71
80
  ];
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
81
  return autoUpdate(referenceElement, floatingElement, () => {
89
82
  computePosition(referenceElement, floatingElement, {
90
83
  placement: placement,
@@ -54,7 +54,7 @@
54
54
  }
55
55
 
56
56
  [data-vc='wrapper'] {
57
- @apply flex items-center content-center h-full;
57
+ @apply flex items-center h-full;
58
58
  }
59
59
 
60
60
  [data-vc='content'] {
@@ -0,0 +1,173 @@
1
+ @import './tw-animate.css';
2
+ @import './date_picker.css';
3
+ @import './nouislider.css';
4
+
5
+ @custom-variant dark (&:is(.dark *));
6
+ @custom-variant fixed (&:is(.layout-fixed *));
7
+
8
+ @theme inline {
9
+ --breakpoint-3xl: 1600px;
10
+ --breakpoint-4xl: 2000px;
11
+ --font-sans: var(--font-sans);
12
+ --font-mono: var(--font-mono);
13
+ --radius-sm: calc(var(--radius) - 4px);
14
+ --radius-md: calc(var(--radius) - 2px);
15
+ --radius-lg: var(--radius);
16
+ --radius-xl: calc(var(--radius) + 4px);
17
+ --color-background: var(--background);
18
+ --color-foreground: var(--foreground);
19
+ --color-card: var(--card);
20
+ --color-card-foreground: var(--card-foreground);
21
+ --color-popover: var(--popover);
22
+ --color-popover-foreground: var(--popover-foreground);
23
+ --color-primary: var(--primary);
24
+ --color-primary-foreground: var(--primary-foreground);
25
+ --color-secondary: var(--secondary);
26
+ --color-secondary-foreground: var(--secondary-foreground);
27
+ --color-muted: var(--muted);
28
+ --color-muted-foreground: var(--muted-foreground);
29
+ --color-accent: var(--accent);
30
+ --color-accent-foreground: var(--accent-foreground);
31
+ --color-destructive: var(--destructive);
32
+ --color-border: var(--border);
33
+ --color-input: var(--input);
34
+ --color-ring: var(--ring);
35
+ --color-chart-1: var(--chart-1);
36
+ --color-chart-2: var(--chart-2);
37
+ --color-chart-3: var(--chart-3);
38
+ --color-chart-4: var(--chart-4);
39
+ --color-chart-5: var(--chart-5);
40
+ --color-sidebar: var(--sidebar);
41
+ --color-sidebar-foreground: var(--sidebar-foreground);
42
+ --color-sidebar-primary: var(--sidebar-primary);
43
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
44
+ --color-sidebar-accent: var(--sidebar-accent);
45
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
46
+ --color-sidebar-border: var(--sidebar-border);
47
+ --color-sidebar-ring: var(--sidebar-ring);
48
+ --color-surface: var(--surface);
49
+ --color-surface-foreground: var(--surface-foreground);
50
+ --color-code: var(--code);
51
+ --color-code-foreground: var(--code-foreground);
52
+ --color-code-highlight: var(--code-highlight);
53
+ --color-code-number: var(--code-number);
54
+ --color-selection: var(--selection);
55
+ --color-selection-foreground: var(--selection-foreground);
56
+ }
57
+
58
+ :root {
59
+ --radius: 0.625rem;
60
+ --background: oklch(1 0 0);
61
+ --foreground: oklch(0.145 0 0);
62
+ --card: oklch(1 0 0);
63
+ --card-foreground: oklch(0.145 0 0);
64
+ --popover: oklch(1 0 0);
65
+ --popover-foreground: oklch(0.145 0 0);
66
+ --primary: oklch(0.205 0 0);
67
+ --primary-foreground: oklch(0.985 0 0);
68
+ --secondary: oklch(0.97 0 0);
69
+ --secondary-foreground: oklch(0.205 0 0);
70
+ --muted: oklch(0.97 0 0);
71
+ --muted-foreground: oklch(0.556 0 0);
72
+ --accent: oklch(0.97 0 0);
73
+ --accent-foreground: oklch(0.205 0 0);
74
+ --destructive: oklch(0.577 0.245 27.325);
75
+ --border: oklch(0.922 0 0);
76
+ --input: oklch(0.922 0 0);
77
+ --ring: oklch(0.708 0 0);
78
+ --chart-1: var(--color-blue-300);
79
+ --chart-2: var(--color-blue-500);
80
+ --chart-3: var(--color-blue-600);
81
+ --chart-4: var(--color-blue-700);
82
+ --chart-5: var(--color-blue-800);
83
+ --sidebar: oklch(0.985 0 0);
84
+ --sidebar-foreground: oklch(0.145 0 0);
85
+ --sidebar-primary: oklch(0.205 0 0);
86
+ --sidebar-primary-foreground: oklch(0.985 0 0);
87
+ --sidebar-accent: oklch(0.97 0 0);
88
+ --sidebar-accent-foreground: oklch(0.205 0 0);
89
+ --sidebar-border: oklch(0.922 0 0);
90
+ --sidebar-ring: oklch(0.708 0 0);
91
+ --surface: oklch(0.98 0 0);
92
+ --surface-foreground: var(--foreground);
93
+ --code: var(--surface);
94
+ --code-foreground: var(--surface-foreground);
95
+ --code-highlight: oklch(0.96 0 0);
96
+ --code-number: oklch(0.56 0 0);
97
+ --selection: oklch(0.145 0 0);
98
+ --selection-foreground: oklch(1 0 0);
99
+ }
100
+
101
+ .dark {
102
+ --background: oklch(0.145 0 0);
103
+ --foreground: oklch(0.985 0 0);
104
+ --card: oklch(0.205 0 0);
105
+ --card-foreground: oklch(0.985 0 0);
106
+ --popover: oklch(0.269 0 0);
107
+ --popover-foreground: oklch(0.985 0 0);
108
+ --primary: oklch(0.922 0 0);
109
+ --primary-foreground: oklch(0.205 0 0);
110
+ --secondary: oklch(0.269 0 0);
111
+ --secondary-foreground: oklch(0.985 0 0);
112
+ --muted: oklch(0.269 0 0);
113
+ --muted-foreground: oklch(0.708 0 0);
114
+ --accent: oklch(0.371 0 0);
115
+ --accent-foreground: oklch(0.985 0 0);
116
+ --destructive: oklch(0.704 0.191 22.216);
117
+ --border: oklch(1 0 0 / 10%);
118
+ --input: oklch(1 0 0 / 15%);
119
+ --ring: oklch(0.556 0 0);
120
+ --chart-1: var(--color-blue-300);
121
+ --chart-2: var(--color-blue-500);
122
+ --chart-3: var(--color-blue-600);
123
+ --chart-4: var(--color-blue-700);
124
+ --chart-5: var(--color-blue-800);
125
+ --sidebar: oklch(0.205 0 0);
126
+ --sidebar-foreground: oklch(0.985 0 0);
127
+ --sidebar-primary: oklch(0.488 0.243 264.376);
128
+ --sidebar-primary-foreground: oklch(0.985 0 0);
129
+ --sidebar-accent: oklch(0.269 0 0);
130
+ --sidebar-accent-foreground: oklch(0.985 0 0);
131
+ --sidebar-border: oklch(1 0 0 / 10%);
132
+ --sidebar-ring: oklch(0.439 0 0);
133
+ --surface: oklch(0.2 0 0);
134
+ --surface-foreground: oklch(0.708 0 0);
135
+ --code: var(--surface);
136
+ --code-foreground: var(--surface-foreground);
137
+ --code-highlight: oklch(0.27 0 0);
138
+ --code-number: oklch(0.72 0 0);
139
+ --selection: oklch(0.922 0 0);
140
+ --selection-foreground: oklch(0.205 0 0);
141
+ }
142
+
143
+ @layer base {
144
+ * {
145
+ @apply border-border outline-ring/50;
146
+ }
147
+ ::selection {
148
+ @apply bg-selection text-selection-foreground;
149
+ }
150
+ html {
151
+ @apply scroll-smooth;
152
+ }
153
+ body {
154
+ font-synthesis-weight: none;
155
+ text-rendering: optimizeLegibility;
156
+ }
157
+
158
+ @supports (font: -apple-system-body) and (-webkit-appearance: none) {
159
+ [data-wrapper] {
160
+ @apply min-[1800px]:border-t;
161
+ }
162
+ }
163
+
164
+ a:active,
165
+ button:active {
166
+ @apply opacity-60 md:opacity-100;
167
+ }
168
+
169
+ button:not(:disabled),
170
+ [role='button']:not(:disabled) {
171
+ cursor: pointer;
172
+ }
173
+ }
@@ -7,6 +7,8 @@ import {
7
7
  } from '../utils'
8
8
 
9
9
  const AccordionController = class extends Controller<HTMLElement> {
10
+ static name = 'accordion'
11
+
10
12
  // targets
11
13
  static targets = ['item', 'trigger', 'content']
12
14
  declare itemTargets: HTMLElement[]
@@ -1,6 +1,8 @@
1
1
  import { DialogController } from './dialog_controller'
2
2
 
3
3
  const AlertDialogController = class extends DialogController {
4
+ static name = 'alert-dialog'
5
+
4
6
  protected onDOMClick() {
5
7
  return
6
8
  }
@@ -1,6 +1,8 @@
1
1
  import { Controller } from '@hotwired/stimulus'
2
2
 
3
3
  const AvatarController = class extends Controller {
4
+ static name = 'avatar'
5
+
4
6
  // targets
5
7
  static targets = ['image', 'fallback']
6
8
  declare readonly imageTarget: HTMLElement
@@ -1,6 +1,8 @@
1
1
  import { Controller } from '@hotwired/stimulus'
2
2
 
3
3
  const CheckboxController = class extends Controller<HTMLElement> {
4
+ static name = 'checkbox'
5
+
4
6
  // targets
5
7
  static targets = ['input', 'indicator']
6
8
  declare readonly inputTarget: HTMLInputElement
@@ -2,6 +2,8 @@ import { Controller } from '@hotwired/stimulus'
2
2
  import { hideContent, showContent } from '../utils'
3
3
 
4
4
  const CollapsibleController = class extends Controller {
5
+ static name = 'collapsible'
6
+
5
7
  // targets
6
8
  static targets = ['trigger', 'content']
7
9
  declare readonly triggerTarget: HTMLElement
@@ -25,6 +25,8 @@ import {
25
25
  import { useClickOutside, useDebounce } from 'stimulus-use'
26
26
 
27
27
  const ComboboxController = class extends Controller<HTMLElement> {
28
+ static name = 'combobox'
29
+
28
30
  // targets
29
31
  static targets = [
30
32
  'trigger',
@@ -115,7 +117,6 @@ const ComboboxController = class extends Controller<HTMLElement> {
115
117
  this.searchInputTarget.focus()
116
118
 
117
119
  let index = 0
118
- console.log('this.selectedValue', this.selectedValue)
119
120
  if (this.selectedValue) {
120
121
  const item = this.filteredItems.find(
121
122
  (i) => i.dataset.value === this.selectedValue,
@@ -31,6 +31,8 @@ declare global {
31
31
  }
32
32
 
33
33
  const CommandController = class extends Controller<HTMLElement> {
34
+ static name = 'command'
35
+
34
36
  // targets
35
37
  static targets = [
36
38
  'trigger',
@@ -19,9 +19,17 @@ import utc from 'dayjs/plugin/utc'
19
19
  dayjs.extend(customParseFormat)
20
20
  dayjs.extend(utc)
21
21
 
22
+ const SMALL_SCREEN_BREAKPOINT = 768
23
+
24
+ const isSmallScreen = () => {
25
+ return window.innerWidth < SMALL_SCREEN_BREAKPOINT
26
+ }
27
+
22
28
  const DAYJS_FORMAT = 'YYYY-MM-DD'
23
29
 
24
30
  const DatePickerController = class extends Controller<HTMLElement> {
31
+ static name = 'date-picker'
32
+
25
33
  // targets
26
34
  static targets = [
27
35
  'trigger',
@@ -55,7 +63,6 @@ const DatePickerController = class extends Controller<HTMLElement> {
55
63
  declare format: string
56
64
  declare mask: boolean
57
65
  declare calendar: Calendar
58
- declare isMobile: boolean
59
66
  declare DOMKeydownListener: (event: KeyboardEvent) => void
60
67
  declare cleanup: () => void
61
68
  declare onClickDateListener: (self: Calendar) => void
@@ -81,9 +88,23 @@ const DatePickerController = class extends Controller<HTMLElement> {
81
88
  }
82
89
 
83
90
  contentContainerTargetConnected() {
84
- // Datepicker is shown as a dialog on small screens
85
- const styles = window.getComputedStyle(this.contentContainerTarget)
86
- this.isMobile = styles.translate === '-50%'
91
+ if (isSmallScreen()) {
92
+ const windowHeight = window.innerHeight
93
+ const datePickerHeight = this.identifier === 'date-picker' ? 300 : 600
94
+
95
+ let topOffset = 0
96
+
97
+ if (windowHeight > datePickerHeight) {
98
+ topOffset = (windowHeight - datePickerHeight) / 2
99
+ }
100
+
101
+ Object.assign(this.contentContainerTarget.style, {
102
+ top: `${topOffset}px`,
103
+ left: '50%',
104
+ transform: 'translateX(-50%)',
105
+ pointerEvents: 'auto',
106
+ })
107
+ }
87
108
  }
88
109
 
89
110
  toggle() {
@@ -154,12 +175,11 @@ const DatePickerController = class extends Controller<HTMLElement> {
154
175
  if (!this.contentTarget.dataset.width) {
155
176
  const contentWidth = this.contentTarget.offsetWidth
156
177
  this.contentTarget.dataset.width = `${contentWidth}`
157
-
158
178
  this.contentTarget.style.maxWidth = `${contentWidth}px`
159
179
  this.contentTarget.style.minWidth = `${contentWidth}px`
160
180
  }
161
181
 
162
- if (this.isMobile) {
182
+ if (isSmallScreen()) {
163
183
  lockScroll(this.contentTarget.id)
164
184
  this.overlayTarget.style.display = ''
165
185
  this.overlayTarget.dataset.state = 'open'
@@ -206,7 +226,7 @@ const DatePickerController = class extends Controller<HTMLElement> {
206
226
  contentContainer: this.contentContainerTarget,
207
227
  })
208
228
 
209
- if (this.isMobile) {
229
+ if (isSmallScreen()) {
210
230
  unlockScroll(this.contentTarget.id)
211
231
  this.overlayTarget.style.display = 'none'
212
232
  this.overlayTarget.dataset.state = 'closed'
@@ -10,6 +10,8 @@ const DELIMITER = ' - '
10
10
  const DAYJS_FORMAT = 'YYYY-MM-DD'
11
11
 
12
12
  const DateRangePickerController = class extends DatePickerController {
13
+ static name = 'date-range-picker'
14
+
13
15
  // targets
14
16
  static targets = [
15
17
  'trigger',
@@ -10,6 +10,8 @@ import {
10
10
  } from '../utils'
11
11
 
12
12
  const DialogController = class extends Controller<HTMLElement> {
13
+ static name = 'dialog'
14
+
13
15
  // targets
14
16
  static targets = ['trigger', 'content', 'overlay']
15
17
  declare readonly triggerTarget: HTMLElement
@@ -49,6 +49,8 @@ const focusItemByIndex = (
49
49
  }
50
50
 
51
51
  const DropdownMenuController = class extends Controller<HTMLElement> {
52
+ static name = 'dropdown-menu'
53
+
52
54
  // targets
53
55
  static targets = ['trigger', 'contentContainer', 'content', 'item']
54
56
  declare readonly triggerTarget: HTMLElement
@@ -9,6 +9,8 @@ import {
9
9
  } from '../utils'
10
10
 
11
11
  const DropdownMenuSubController = class extends Controller<HTMLElement> {
12
+ static name = 'dropdown-menu-sub'
13
+
12
14
  // targets
13
15
  static targets = ['trigger', 'contentContainer', 'content']
14
16
  declare readonly triggerTarget: HTMLElement
@@ -1,6 +1,8 @@
1
1
  import { Controller } from '@hotwired/stimulus'
2
2
 
3
3
  const FormFieldController = class extends Controller {
4
+ static name = 'form-field'
5
+
4
6
  connect() {
5
7
  const hintContainer = this.element.querySelector('[data-remove-label]')
6
8
  const labelContainer = this.element.querySelector('[data-remove-hint]')
@@ -4,6 +4,8 @@ import { initFloatingUi } from '../utils/floating_ui'
4
4
  import { showContent, hideContent } from '../utils'
5
5
 
6
6
  const HoverCardController = class extends Controller<HTMLElement> {
7
+ static name = 'hover-card'
8
+
7
9
  // targets
8
10
  static targets = ['trigger', 'content', 'contentContainer']
9
11
  declare readonly triggerTarget: HTMLElement
@@ -1,6 +1,8 @@
1
1
  import { Controller } from '@hotwired/stimulus'
2
2
 
3
3
  const LoadingButtonController = class extends Controller<HTMLButtonElement> {
4
+ static name = 'loading-button'
5
+
4
6
  connect() {
5
7
  const el = this.element
6
8
  const form = el.closest('form')
@@ -12,6 +12,8 @@ import {
12
12
  } from '../utils'
13
13
 
14
14
  const PopoverController = class extends Controller<HTMLElement> {
15
+ static name = 'popover'
16
+
15
17
  // targets
16
18
  static targets = ['trigger', 'contentContainer', 'content']
17
19
  declare readonly triggerTarget: HTMLElement
@@ -1,6 +1,8 @@
1
1
  import { Controller } from '@hotwired/stimulus'
2
2
 
3
3
  const ProgressController = class extends Controller {
4
+ static name = 'progress'
5
+
4
6
  // targets
5
7
  static targets = ['indicator']
6
8
  declare readonly indicatorTarget: HTMLElement
@@ -1,6 +1,8 @@
1
1
  import { Controller } from '@hotwired/stimulus'
2
2
 
3
3
  const RadioGroupController = class extends Controller<HTMLElement> {
4
+ static name = 'radio-group'
5
+
4
6
  // targets
5
7
  static targets = ['item', 'input', 'indicator']
6
8
  declare readonly itemTargets: HTMLInputElement[]
@@ -17,6 +17,8 @@ import {
17
17
  import { Controller } from '@hotwired/stimulus'
18
18
 
19
19
  const SelectController = class extends Controller<HTMLElement> {
20
+ static name = 'select'
21
+
20
22
  // targets
21
23
  static targets = [
22
24
  'trigger',
@@ -2,6 +2,8 @@ import { Controller } from '@hotwired/stimulus'
2
2
  import noUiSlider, { API, Options } from 'nouislider'
3
3
 
4
4
  const SliderController = class extends Controller<HTMLElement> {
5
+ static name = 'slider'
6
+
5
7
  // targets
6
8
  static targets = ['slider', 'hiddenInput', 'endHiddenInput']
7
9
  declare readonly sliderTarget: HTMLInputElement
@@ -1,6 +1,8 @@
1
1
  import { Controller } from '@hotwired/stimulus'
2
2
 
3
3
  const SwitchController = class extends Controller<HTMLElement> {
4
+ static name = 'switch'
5
+
4
6
  // targets
5
7
  static targets = ['input', 'thumb']
6
8
  declare readonly inputTarget: HTMLInputElement
@@ -2,6 +2,8 @@ import { Controller } from '@hotwired/stimulus'
2
2
  import { getNextEnabledIndex, getPreviousEnabledIndex } from '../utils'
3
3
 
4
4
  const TabsController = class extends Controller {
5
+ static name = 'tabs'
6
+
5
7
  // targets
6
8
  static targets = ['trigger', 'content']
7
9
  declare readonly triggerTargets: HTMLButtonElement[]