@solidxai/core-ui 0.1.13-beta.4 → 0.1.13-beta.6

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 (149) hide show
  1. package/dist/components/auth/AuthTabs.d.ts.map +1 -1
  2. package/dist/components/auth/AuthTabs.js +1 -1
  3. package/dist/components/auth/AuthTabs.js.map +1 -1
  4. package/dist/components/auth/AuthTabs.tsx +1 -0
  5. package/dist/components/auth/SolidChangeForcePassword.d.ts.map +1 -1
  6. package/dist/components/auth/SolidChangeForcePassword.js +2 -2
  7. package/dist/components/auth/SolidChangeForcePassword.js.map +1 -1
  8. package/dist/components/auth/SolidChangeForcePassword.tsx +9 -8
  9. package/dist/components/common/SettingsComponent.d.ts.map +1 -1
  10. package/dist/components/common/SettingsComponent.js +1 -1
  11. package/dist/components/common/SettingsComponent.js.map +1 -1
  12. package/dist/components/common/SettingsComponent.tsx +1 -0
  13. package/dist/components/common/SolidFieldTooltip.d.ts.map +1 -1
  14. package/dist/components/common/SolidFieldTooltip.js +1 -33
  15. package/dist/components/common/SolidFieldTooltip.js.map +1 -1
  16. package/dist/components/common/SolidFieldTooltip.tsx +8 -64
  17. package/dist/components/common/SolidMaterialSymbol.d.ts +1 -1
  18. package/dist/components/common/SolidMaterialSymbol.d.ts.map +1 -1
  19. package/dist/components/common/SolidMaterialSymbol.js +6 -37
  20. package/dist/components/common/SolidMaterialSymbol.js.map +1 -1
  21. package/dist/components/common/SolidMaterialSymbol.tsx +6 -54
  22. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts.map +1 -1
  23. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js +2 -2
  24. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js.map +1 -1
  25. package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.tsx +2 -0
  26. package/dist/components/core/card/CardItem.d.ts.map +1 -1
  27. package/dist/components/core/card/CardItem.js +1 -1
  28. package/dist/components/core/card/CardItem.js.map +1 -1
  29. package/dist/components/core/card/CardItem.tsx +16 -14
  30. package/dist/components/core/card/SolidCardView.d.ts.map +1 -1
  31. package/dist/components/core/card/SolidCardView.js +69 -40
  32. package/dist/components/core/card/SolidCardView.js.map +1 -1
  33. package/dist/components/core/card/SolidCardView.tsx +55 -24
  34. package/dist/components/core/common/SolidAccountSettings/SolidAccountSettings.module.css +99 -0
  35. package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.d.ts.map +1 -1
  36. package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.js +76 -5
  37. package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.js.map +1 -1
  38. package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.tsx +39 -4
  39. package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
  40. package/dist/components/core/common/SolidGlobalSearchElement.js +172 -124
  41. package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
  42. package/dist/components/core/common/SolidGlobalSearchElement.tsx +73 -84
  43. package/dist/components/core/common/globalSearchPersistence.d.ts +3 -0
  44. package/dist/components/core/common/globalSearchPersistence.d.ts.map +1 -1
  45. package/dist/components/core/common/globalSearchPersistence.js +33 -24
  46. package/dist/components/core/common/globalSearchPersistence.js.map +1 -1
  47. package/dist/components/core/common/globalSearchPersistence.ts +34 -27
  48. package/dist/components/core/filter/fields/SolidMediaMultipleField.js +2 -2
  49. package/dist/components/core/filter/fields/SolidMediaMultipleField.js.map +1 -1
  50. package/dist/components/core/filter/fields/SolidMediaMultipleField.tsx +2 -2
  51. package/dist/components/core/filter/fields/SolidMediaSingleField.js +2 -2
  52. package/dist/components/core/filter/fields/SolidMediaSingleField.js.map +1 -1
  53. package/dist/components/core/filter/fields/SolidMediaSingleField.tsx +2 -2
  54. package/dist/components/core/filter/fields/SolidShortTextField.js +2 -2
  55. package/dist/components/core/filter/fields/SolidShortTextField.js.map +1 -1
  56. package/dist/components/core/filter/fields/SolidShortTextField.tsx +2 -2
  57. package/dist/components/core/kanban/KanbanCard.d.ts.map +1 -1
  58. package/dist/components/core/kanban/KanbanCard.js +1 -1
  59. package/dist/components/core/kanban/KanbanCard.js.map +1 -1
  60. package/dist/components/core/kanban/KanbanCard.tsx +18 -16
  61. package/dist/components/core/kanban/SolidKanbanView.d.ts.map +1 -1
  62. package/dist/components/core/kanban/SolidKanbanView.js +67 -48
  63. package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
  64. package/dist/components/core/kanban/SolidKanbanView.tsx +51 -11
  65. package/dist/components/core/kanban/SolidKanbanViewConfigure.d.ts +1 -1
  66. package/dist/components/core/kanban/SolidKanbanViewConfigure.d.ts.map +1 -1
  67. package/dist/components/core/kanban/SolidKanbanViewConfigure.js +11 -2
  68. package/dist/components/core/kanban/SolidKanbanViewConfigure.js.map +1 -1
  69. package/dist/components/core/kanban/SolidKanbanViewConfigure.tsx +35 -0
  70. package/dist/components/core/list/SolidListView.d.ts.map +1 -1
  71. package/dist/components/core/list/SolidListView.js +6 -2
  72. package/dist/components/core/list/SolidListView.js.map +1 -1
  73. package/dist/components/core/list/SolidListView.tsx +7 -1
  74. package/dist/components/core/list/SolidListViewConfigure.d.ts.map +1 -1
  75. package/dist/components/core/list/SolidListViewConfigure.js +15 -11
  76. package/dist/components/core/list/SolidListViewConfigure.js.map +1 -1
  77. package/dist/components/core/list/SolidListViewConfigure.tsx +25 -6
  78. package/dist/components/core/list/SolidListViewHeaderContextMenuButton.d.ts +1 -1
  79. package/dist/components/core/list/SolidListViewHeaderContextMenuButton.d.ts.map +1 -1
  80. package/dist/components/core/list/SolidListViewHeaderContextMenuButton.js +3 -1
  81. package/dist/components/core/list/SolidListViewHeaderContextMenuButton.js.map +1 -1
  82. package/dist/components/core/list/SolidListViewHeaderContextMenuButton.tsx +3 -1
  83. package/dist/components/core/list/columns/SolidMediaMultipleColumn.d.ts.map +1 -1
  84. package/dist/components/core/list/columns/SolidMediaMultipleColumn.js +7 -0
  85. package/dist/components/core/list/columns/SolidMediaMultipleColumn.js.map +1 -1
  86. package/dist/components/core/list/columns/SolidMediaMultipleColumn.tsx +5 -0
  87. package/dist/components/core/list/columns/SolidMediaSingleColumn.d.ts.map +1 -1
  88. package/dist/components/core/list/columns/SolidMediaSingleColumn.js +3 -0
  89. package/dist/components/core/list/columns/SolidMediaSingleColumn.js.map +1 -1
  90. package/dist/components/core/list/columns/SolidMediaSingleColumn.tsx +2 -0
  91. package/dist/components/core/list/widgets/SolidShortTextFieldImageRenderModeWidget.d.ts.map +1 -1
  92. package/dist/components/core/list/widgets/SolidShortTextFieldImageRenderModeWidget.js +3 -0
  93. package/dist/components/core/list/widgets/SolidShortTextFieldImageRenderModeWidget.js.map +1 -1
  94. package/dist/components/core/list/widgets/SolidShortTextFieldImageRenderModeWidget.tsx +2 -0
  95. package/dist/components/core/model/CreateModel.css +10 -0
  96. package/dist/components/core/model/FieldMetaDataForm.css +10 -0
  97. package/dist/components/core/model/FieldMetaDataForm.js +8 -8
  98. package/dist/components/core/model/FieldMetaDataForm.js.map +1 -1
  99. package/dist/components/core/model/FieldMetaDataForm.tsx +13 -13
  100. package/dist/components/core/module/ModuleMetadataExplorer.css +23 -0
  101. package/dist/components/core/module/ModuleMetadataExplorer.d.ts.map +1 -1
  102. package/dist/components/core/module/ModuleMetadataExplorer.js +1 -1
  103. package/dist/components/core/module/ModuleMetadataExplorer.js.map +1 -1
  104. package/dist/components/core/module/ModuleMetadataExplorer.tsx +9 -0
  105. package/dist/components/core/tree/SolidTreeView.d.ts.map +1 -1
  106. package/dist/components/core/tree/SolidTreeView.js +249 -138
  107. package/dist/components/core/tree/SolidTreeView.js.map +1 -1
  108. package/dist/components/core/tree/SolidTreeView.tsx +220 -92
  109. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.d.ts.map +1 -1
  110. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.js +1 -1
  111. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.js.map +1 -1
  112. package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.tsx +1 -0
  113. package/dist/components/layout/AdminHeaderActions.js +6 -13
  114. package/dist/components/layout/AdminHeaderActions.js.map +1 -1
  115. package/dist/components/layout/AdminHeaderActions.tsx +11 -11
  116. package/dist/components/layout/AdminLayout.d.ts.map +1 -1
  117. package/dist/components/layout/AdminLayout.js +2 -2
  118. package/dist/components/layout/AdminLayout.js.map +1 -1
  119. package/dist/components/layout/AdminLayout.tsx +5 -4
  120. package/dist/components/layout/AppSidebar.d.ts.map +1 -1
  121. package/dist/components/layout/AppSidebar.js +17 -2
  122. package/dist/components/layout/AppSidebar.js.map +1 -1
  123. package/dist/components/layout/AppSidebar.tsx +21 -2
  124. package/dist/components/shad-cn-ui/SolidDatePicker.d.ts +1 -1
  125. package/dist/components/shad-cn-ui/SolidDatePicker.d.ts.map +1 -1
  126. package/dist/components/shad-cn-ui/SolidDatePicker.js +35 -3
  127. package/dist/components/shad-cn-ui/SolidDatePicker.js.map +1 -1
  128. package/dist/components/shad-cn-ui/SolidDatePicker.tsx +84 -0
  129. package/dist/components/shad-cn-ui/SolidTooltip.d.ts.map +1 -1
  130. package/dist/components/shad-cn-ui/SolidTooltip.js +55 -2
  131. package/dist/components/shad-cn-ui/SolidTooltip.js.map +1 -1
  132. package/dist/components/shad-cn-ui/SolidTooltip.tsx +95 -1
  133. package/dist/helpers/downloadMediaFile.d.ts.map +1 -1
  134. package/dist/helpers/downloadMediaFile.js +80 -5
  135. package/dist/helpers/downloadMediaFile.js.map +1 -1
  136. package/dist/helpers/downloadMediaFile.tsx +33 -6
  137. package/dist/resources/globals.css +109 -1
  138. package/dist/resources/solid-custom.css +53 -3
  139. package/dist/resources/solid-tailwind-generated.css +1 -1
  140. package/dist/routes/pages/admin/core/DashboardPage.d.ts.map +1 -1
  141. package/dist/routes/pages/admin/core/DashboardPage.js +2 -2
  142. package/dist/routes/pages/admin/core/DashboardPage.js.map +1 -1
  143. package/dist/routes/pages/admin/core/DashboardPage.tsx +2 -0
  144. package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.d.ts.map +1 -1
  145. package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.js +1 -1
  146. package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.js.map +1 -1
  147. package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.tsx +1 -0
  148. package/dist/types/css-modules.d.ts +2 -0
  149. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"SolidDatePicker.js","sourceRoot":"","sources":["../../../src/components/shad-cn-ui/SolidDatePicker.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\nimport ReactDatePicker from \"react-datepicker\";\nimport \"react-datepicker/dist/react-datepicker.css\";\nimport { SolidInput } from \"./SolidInput\";\n\ntype SolidDatePickerProps = React.ComponentProps<typeof ReactDatePicker> & {\n timeOnly?: boolean;\n inputClassName?: string;\n};\n\ntype SolidDatePickerInputProps = React.InputHTMLAttributes<HTMLInputElement> & {\n displayValue?: string;\n};\n\nfunction formatDateValue(value: Date | null | undefined, pattern?: string) {\n if (!value || !(value instanceof Date) || Number.isNaN(value.getTime())) {\n return \"\";\n }\n if (!pattern) {\n return value.toISOString();\n }\n const pad = (num: number, length = 2) => String(num).padStart(length, \"0\");\n const hours = value.getHours();\n const minutes = value.getMinutes();\n const seconds = value.getSeconds();\n const ampm = hours >= 12 ? \"PM\" : \"AM\";\n const h12 = hours % 12 || 12;\n\n return pattern\n .replace(/yyyy/g, String(value.getFullYear()))\n .replace(/MM/g, pad(value.getMonth() + 1))\n .replace(/dd/g, pad(value.getDate()))\n .replace(/HH/g, pad(hours))\n .replace(/hh/g, pad(h12))\n .replace(/h/g, String(h12))\n .replace(/mm/g, pad(minutes))\n .replace(/ss/g, pad(seconds))\n .replace(/aa/g, ampm)\n .replace(/a/g, ampm);\n}\n\nconst SolidDatePickerInput = React.forwardRef<HTMLInputElement, SolidDatePickerInputProps>(\n ({ className, displayValue, ...props }, ref) => (\n <SolidInput\n ref={ref}\n {...props}\n value={displayValue ?? (typeof props.value === \"string\" ? props.value : \"\")}\n readOnly\n className={className}\n />\n )\n);\n\nSolidDatePickerInput.displayName = \"SolidDatePickerInput\";\n\nfunction cx(...parts: Array<string | false | undefined>) {\n return parts.filter(Boolean).join(\" \");\n}\n\nexport function SolidDatePicker({\n timeOnly,\n showTimeSelect,\n inputClassName,\n selected,\n dateFormat,\n calendarClassName,\n popperClassName,\n className,\n ...props\n}: SolidDatePickerProps) {\n const resolvedShowTime = timeOnly ? true : showTimeSelect;\n const resolvedFormat = (Array.isArray(dateFormat) ? dateFormat[0] : dateFormat) ?? \"yyyy-MM-dd\";\n const displayValue = formatDateValue(selected as Date | null | undefined, resolvedFormat);\n\n return (\n <ReactDatePicker\n popperProps={{ strategy: \"fixed\" }}\n popperPlacement=\"bottom-start\"\n {...props}\n selected={selected}\n showTimeSelect={resolvedShowTime}\n showTimeSelectOnly={timeOnly}\n calendarClassName={cx(\"solid-react-datepicker-calendar\", calendarClassName)}\n popperClassName={cx(\"solid-react-datepicker-popper\", popperClassName)}\n customInput={<SolidDatePickerInput className={inputClassName} displayValue={displayValue} />}\n className={cx(\"solid-datepicker\", className)}\n />\n );\n}\n"]}
1
+ {"version":3,"file":"SolidDatePicker.js","sourceRoot":"","sources":["../../../src/components/shad-cn-ui/SolidDatePicker.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from \"react\";\nimport ReactDatePicker from \"react-datepicker\";\nimport \"react-datepicker/dist/react-datepicker.css\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport { SolidInput } from \"./SolidInput\";\nimport { SolidSelect } from \"./SolidSelect\";\n\ntype SolidDatePickerProps = React.ComponentProps<typeof ReactDatePicker> & {\n timeOnly?: boolean;\n inputClassName?: string;\n};\n\ntype SolidDatePickerInputProps = React.InputHTMLAttributes<HTMLInputElement> & {\n displayValue?: string;\n};\n\nfunction formatDateValue(value: Date | null | undefined, pattern?: string) {\n if (!value || !(value instanceof Date) || Number.isNaN(value.getTime())) {\n return \"\";\n }\n if (!pattern) {\n return value.toISOString();\n }\n const pad = (num: number, length = 2) => String(num).padStart(length, \"0\");\n const hours = value.getHours();\n const minutes = value.getMinutes();\n const seconds = value.getSeconds();\n const ampm = hours >= 12 ? \"PM\" : \"AM\";\n const h12 = hours % 12 || 12;\n\n return pattern\n .replace(/yyyy/g, String(value.getFullYear()))\n .replace(/MM/g, pad(value.getMonth() + 1))\n .replace(/dd/g, pad(value.getDate()))\n .replace(/HH/g, pad(hours))\n .replace(/hh/g, pad(h12))\n .replace(/h/g, String(h12))\n .replace(/mm/g, pad(minutes))\n .replace(/ss/g, pad(seconds))\n .replace(/aa/g, ampm)\n .replace(/a/g, ampm);\n}\n\nconst SolidDatePickerInput = React.forwardRef<HTMLInputElement, SolidDatePickerInputProps>(\n ({ className, displayValue, ...props }, ref) => (\n <SolidInput\n ref={ref}\n {...props}\n value={displayValue ?? (typeof props.value === \"string\" ? props.value : \"\")}\n readOnly\n className={className}\n />\n )\n);\n\nSolidDatePickerInput.displayName = \"SolidDatePickerInput\";\n\nfunction cx(...parts: Array<string | false | undefined>) {\n return parts.filter(Boolean).join(\" \");\n}\n\nconst MONTH_OPTIONS = Array.from({ length: 12 }, (_, monthIndex) => ({\n value: monthIndex,\n label: new Intl.DateTimeFormat(undefined, { month: \"long\" }).format(new Date(2026, monthIndex, 1)),\n}));\n\nfunction buildYearOptions(selected: Date | null | undefined, minDate?: Date | null, maxDate?: Date | null) {\n const selectedYear = selected?.getFullYear() ?? new Date().getFullYear();\n const minYear = minDate?.getFullYear() ?? 1900;\n const maxYear = maxDate?.getFullYear() ?? Math.max(2100, selectedYear + 25);\n const years: number[] = [];\n\n for (let year = minYear; year <= maxYear; year += 1) {\n years.push(year);\n }\n\n return years;\n}\n\nexport function SolidDatePicker({\n timeOnly,\n showTimeSelect,\n inputClassName,\n selected,\n dateFormat,\n calendarClassName,\n popperClassName,\n className,\n minDate,\n maxDate,\n renderCustomHeader,\n showMonthDropdown,\n showYearDropdown,\n ...props\n}: SolidDatePickerProps) {\n const resolvedShowTime = timeOnly ? true : showTimeSelect;\n const resolvedFormat = (Array.isArray(dateFormat) ? dateFormat[0] : dateFormat) ?? \"yyyy-MM-dd\";\n const displayValue = formatDateValue(selected as Date | null | undefined, resolvedFormat);\n const enableMonthDropdown = showMonthDropdown ?? !timeOnly;\n const enableYearDropdown = showYearDropdown ?? !timeOnly;\n const shouldUseCustomHeader = !timeOnly && !renderCustomHeader;\n const yearOptions = buildYearOptions(selected as Date | null | undefined, minDate as Date | null | undefined, maxDate as Date | null | undefined);\n\n return (\n <ReactDatePicker\n popperProps={{ strategy: \"fixed\" }}\n popperPlacement=\"bottom-start\"\n {...props}\n selected={selected}\n minDate={minDate}\n maxDate={maxDate}\n showTimeSelect={resolvedShowTime}\n showTimeSelectOnly={timeOnly}\n showMonthDropdown={enableMonthDropdown}\n showYearDropdown={enableYearDropdown}\n renderCustomHeader={\n shouldUseCustomHeader\n ? ({ date, changeYear, changeMonth, decreaseMonth, increaseMonth, prevMonthButtonDisabled, nextMonthButtonDisabled }: any) => (\n <div className=\"solid-react-datepicker-header\">\n <button\n type=\"button\"\n className=\"solid-react-datepicker-nav\"\n onClick={decreaseMonth}\n disabled={prevMonthButtonDisabled}\n aria-label=\"Previous month\"\n >\n <ChevronLeft size={16} />\n </button>\n\n <div className=\"solid-react-datepicker-selects\">\n <div className=\"solid-react-datepicker-select-shell solid-react-datepicker-select-shell--month\">\n <SolidSelect\n native={false}\n className=\"solid-react-datepicker-select-wrap\"\n value={date.getMonth()}\n options={MONTH_OPTIONS}\n menuPlacement=\"bottom\"\n onChange={({ value }) => changeMonth(Number(value))}\n />\n </div>\n\n <div className=\"solid-react-datepicker-select-shell solid-react-datepicker-select-shell--year\">\n <SolidSelect\n native={false}\n className=\"solid-react-datepicker-select-wrap\"\n value={date.getFullYear()}\n options={yearOptions.map((year) => ({ label: String(year), value: year }))}\n menuPlacement=\"bottom\"\n onChange={({ value }) => changeYear(Number(value))}\n />\n </div>\n </div>\n\n <button\n type=\"button\"\n className=\"solid-react-datepicker-nav\"\n onClick={increaseMonth}\n disabled={nextMonthButtonDisabled}\n aria-label=\"Next month\"\n >\n <ChevronRight size={16} />\n </button>\n </div>\n )\n : renderCustomHeader\n }\n calendarClassName={cx(\"solid-react-datepicker-calendar\", calendarClassName)}\n popperClassName={cx(\"solid-react-datepicker-popper\", popperClassName)}\n customInput={<SolidDatePickerInput className={inputClassName} displayValue={displayValue} />}\n className={cx(\"solid-datepicker\", className)}\n />\n );\n}\n"]}
@@ -1,7 +1,9 @@
1
1
  import React from "react";
2
2
  import ReactDatePicker from "react-datepicker";
3
3
  import "react-datepicker/dist/react-datepicker.css";
4
+ import { ChevronLeft, ChevronRight } from "lucide-react";
4
5
  import { SolidInput } from "./SolidInput";
6
+ import { SolidSelect } from "./SolidSelect";
5
7
 
6
8
  type SolidDatePickerProps = React.ComponentProps<typeof ReactDatePicker> & {
7
9
  timeOnly?: boolean;
@@ -57,6 +59,24 @@ function cx(...parts: Array<string | false | undefined>) {
57
59
  return parts.filter(Boolean).join(" ");
58
60
  }
59
61
 
62
+ const MONTH_OPTIONS = Array.from({ length: 12 }, (_, monthIndex) => ({
63
+ value: monthIndex,
64
+ label: new Intl.DateTimeFormat(undefined, { month: "long" }).format(new Date(2026, monthIndex, 1)),
65
+ }));
66
+
67
+ function buildYearOptions(selected: Date | null | undefined, minDate?: Date | null, maxDate?: Date | null) {
68
+ const selectedYear = selected?.getFullYear() ?? new Date().getFullYear();
69
+ const minYear = minDate?.getFullYear() ?? 1900;
70
+ const maxYear = maxDate?.getFullYear() ?? Math.max(2100, selectedYear + 25);
71
+ const years: number[] = [];
72
+
73
+ for (let year = minYear; year <= maxYear; year += 1) {
74
+ years.push(year);
75
+ }
76
+
77
+ return years;
78
+ }
79
+
60
80
  export function SolidDatePicker({
61
81
  timeOnly,
62
82
  showTimeSelect,
@@ -66,11 +86,20 @@ export function SolidDatePicker({
66
86
  calendarClassName,
67
87
  popperClassName,
68
88
  className,
89
+ minDate,
90
+ maxDate,
91
+ renderCustomHeader,
92
+ showMonthDropdown,
93
+ showYearDropdown,
69
94
  ...props
70
95
  }: SolidDatePickerProps) {
71
96
  const resolvedShowTime = timeOnly ? true : showTimeSelect;
72
97
  const resolvedFormat = (Array.isArray(dateFormat) ? dateFormat[0] : dateFormat) ?? "yyyy-MM-dd";
73
98
  const displayValue = formatDateValue(selected as Date | null | undefined, resolvedFormat);
99
+ const enableMonthDropdown = showMonthDropdown ?? !timeOnly;
100
+ const enableYearDropdown = showYearDropdown ?? !timeOnly;
101
+ const shouldUseCustomHeader = !timeOnly && !renderCustomHeader;
102
+ const yearOptions = buildYearOptions(selected as Date | null | undefined, minDate as Date | null | undefined, maxDate as Date | null | undefined);
74
103
 
75
104
  return (
76
105
  <ReactDatePicker
@@ -78,8 +107,63 @@ export function SolidDatePicker({
78
107
  popperPlacement="bottom-start"
79
108
  {...props}
80
109
  selected={selected}
110
+ minDate={minDate}
111
+ maxDate={maxDate}
81
112
  showTimeSelect={resolvedShowTime}
82
113
  showTimeSelectOnly={timeOnly}
114
+ showMonthDropdown={enableMonthDropdown}
115
+ showYearDropdown={enableYearDropdown}
116
+ renderCustomHeader={
117
+ shouldUseCustomHeader
118
+ ? ({ date, changeYear, changeMonth, decreaseMonth, increaseMonth, prevMonthButtonDisabled, nextMonthButtonDisabled }: any) => (
119
+ <div className="solid-react-datepicker-header">
120
+ <button
121
+ type="button"
122
+ className="solid-react-datepicker-nav"
123
+ onClick={decreaseMonth}
124
+ disabled={prevMonthButtonDisabled}
125
+ aria-label="Previous month"
126
+ >
127
+ <ChevronLeft size={16} />
128
+ </button>
129
+
130
+ <div className="solid-react-datepicker-selects">
131
+ <div className="solid-react-datepicker-select-shell solid-react-datepicker-select-shell--month">
132
+ <SolidSelect
133
+ native={false}
134
+ className="solid-react-datepicker-select-wrap"
135
+ value={date.getMonth()}
136
+ options={MONTH_OPTIONS}
137
+ menuPlacement="bottom"
138
+ onChange={({ value }) => changeMonth(Number(value))}
139
+ />
140
+ </div>
141
+
142
+ <div className="solid-react-datepicker-select-shell solid-react-datepicker-select-shell--year">
143
+ <SolidSelect
144
+ native={false}
145
+ className="solid-react-datepicker-select-wrap"
146
+ value={date.getFullYear()}
147
+ options={yearOptions.map((year) => ({ label: String(year), value: year }))}
148
+ menuPlacement="bottom"
149
+ onChange={({ value }) => changeYear(Number(value))}
150
+ />
151
+ </div>
152
+ </div>
153
+
154
+ <button
155
+ type="button"
156
+ className="solid-react-datepicker-nav"
157
+ onClick={increaseMonth}
158
+ disabled={nextMonthButtonDisabled}
159
+ aria-label="Next month"
160
+ >
161
+ <ChevronRight size={16} />
162
+ </button>
163
+ </div>
164
+ )
165
+ : renderCustomHeader
166
+ }
83
167
  calendarClassName={cx("solid-react-datepicker-calendar", calendarClassName)}
84
168
  popperClassName={cx("solid-react-datepicker-popper", popperClassName)}
85
169
  customInput={<SolidDatePickerInput className={inputClassName} displayValue={displayValue} />}
@@ -1 +1 @@
1
- {"version":3,"file":"SolidTooltip.d.ts","sourceRoot":"","sources":["../../../src/components/shad-cn-ui/SolidTooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,KAAK,wBAAwB,GAAG;IAC9B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,IAAI,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC3C,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,wBAAwB,GAAG;IAC9B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAMF,eAAO,MAAM,YAAY,iEAKtB,iBAAiB,4CAMnB,CAAC;AAEF,eAAO,MAAM,mBAAmB,0BAAmC,wBAAwB,4CAE1F,CAAC;AAEF,eAAO,MAAM,mBAAmB,0CAK7B,wBAAwB,4CAgB1B,CAAC"}
1
+ {"version":3,"file":"SolidTooltip.d.ts","sourceRoot":"","sources":["../../../src/components/shad-cn-ui/SolidTooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,KAAK,wBAAwB,GAAG;IAC9B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,IAAI,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC3C,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,wBAAwB,GAAG;IAC9B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAgCF,eAAO,MAAM,YAAY,iEAKtB,iBAAiB,4CA4CnB,CAAC;AAEF,eAAO,MAAM,mBAAmB,0BAAmC,wBAAwB,4CAa1F,CAAC;AAEF,eAAO,MAAM,mBAAmB,0CAK7B,wBAAwB,4CAkC1B,CAAC"}
@@ -1,5 +1,8 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from "react";
2
3
  import * as Tooltip from "@radix-ui/react-tooltip";
4
+ import { SolidPopover, SolidPopoverContent, SolidPopoverTrigger } from "./SolidPopover";
5
+ var SolidTooltipContext = React.createContext(null);
3
6
  function cx() {
4
7
  var parts = [];
5
8
  for (var _i = 0; _i < arguments.length; _i++) {
@@ -7,16 +10,66 @@ function cx() {
7
10
  }
8
11
  return parts.filter(Boolean).join(" ");
9
12
  }
13
+ function canUseTapPopoverTrigger(children, asChild, isTouchDevice) {
14
+ if (!isTouchDevice) {
15
+ return false;
16
+ }
17
+ if (!asChild || !React.isValidElement(children)) {
18
+ return true;
19
+ }
20
+ var childProps = children.props;
21
+ return (typeof childProps.onClick !== "function" &&
22
+ typeof childProps.href !== "string" &&
23
+ typeof childProps.to !== "string");
24
+ }
10
25
  export var SolidTooltip = function (_a) {
11
26
  var children = _a.children, defaultOpen = _a.defaultOpen, _b = _a.delayDuration, delayDuration = _b === void 0 ? 200 : _b, _c = _a.skipDelayDuration, skipDelayDuration = _c === void 0 ? 300 : _c;
12
- return (_jsx(Tooltip.Provider, { delayDuration: delayDuration, skipDelayDuration: skipDelayDuration, children: _jsx(Tooltip.Root, { defaultOpen: defaultOpen, children: children }) }));
27
+ var _d = React.useState(false), isTouchDevice = _d[0], setIsTouchDevice = _d[1];
28
+ var _e = React.useState(false), useTapPopover = _e[0], setUseTapPopover = _e[1];
29
+ React.useEffect(function () {
30
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") {
31
+ return;
32
+ }
33
+ var touchMedia = window.matchMedia("(hover: none), (pointer: coarse)");
34
+ var updateMode = function () { return setIsTouchDevice(touchMedia.matches); };
35
+ updateMode();
36
+ if (typeof touchMedia.addEventListener === "function") {
37
+ touchMedia.addEventListener("change", updateMode);
38
+ return function () { return touchMedia.removeEventListener("change", updateMode); };
39
+ }
40
+ touchMedia.addListener(updateMode);
41
+ return function () { return touchMedia.removeListener(updateMode); };
42
+ }, []);
43
+ React.useEffect(function () {
44
+ if (!isTouchDevice && useTapPopover) {
45
+ setUseTapPopover(false);
46
+ }
47
+ }, [isTouchDevice, useTapPopover]);
48
+ var content = (_jsx(SolidTooltipContext.Provider, { value: { isTouchDevice: isTouchDevice, useTapPopover: useTapPopover, setUseTapPopover: setUseTapPopover }, children: children }));
49
+ if (isTouchDevice && useTapPopover) {
50
+ return _jsx(SolidPopover, { autoCloseGroup: "solid-tooltip", children: content });
51
+ }
52
+ return (_jsx(Tooltip.Provider, { delayDuration: delayDuration, skipDelayDuration: skipDelayDuration, children: _jsx(Tooltip.Root, { defaultOpen: defaultOpen, children: content }) }));
13
53
  };
14
54
  export var SolidTooltipTrigger = function (_a) {
15
- var children = _a.children, _b = _a.asChild, asChild = _b === void 0 ? false : _b;
55
+ var _b;
56
+ var children = _a.children, _c = _a.asChild, asChild = _c === void 0 ? false : _c;
57
+ var context = React.useContext(SolidTooltipContext);
58
+ var shouldUseTapPopover = canUseTapPopoverTrigger(children, asChild, (_b = context === null || context === void 0 ? void 0 : context.isTouchDevice) !== null && _b !== void 0 ? _b : false);
59
+ React.useEffect(function () {
60
+ context === null || context === void 0 ? void 0 : context.setUseTapPopover(shouldUseTapPopover);
61
+ }, [context, shouldUseTapPopover]);
62
+ if (context === null || context === void 0 ? void 0 : context.useTapPopover) {
63
+ return _jsx(SolidPopoverTrigger, { asChild: asChild, children: children });
64
+ }
16
65
  return _jsx(Tooltip.Trigger, { asChild: asChild, children: children });
17
66
  };
18
67
  export var SolidTooltipContent = function (_a) {
19
68
  var children = _a.children, _b = _a.side, side = _b === void 0 ? "top" : _b, _c = _a.align, align = _c === void 0 ? "center" : _c, className = _a.className;
69
+ var context = React.useContext(SolidTooltipContext);
70
+ if ((context === null || context === void 0 ? void 0 : context.isTouchDevice) && context.useTapPopover) {
71
+ return (_jsx(SolidPopoverContent, { side: side, align: align, className: cx("solid-tooltip-content", className), sideOffset: 6, children: children }));
72
+ }
20
73
  return (_jsx(Tooltip.Portal, { children: _jsx(Tooltip.Content, { side: side, align: align, className: cx("solid-tooltip-content", className), sideOffset: 6, children: children }) }));
21
74
  };
22
75
  //# sourceMappingURL=SolidTooltip.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SolidTooltip.js","sourceRoot":"","sources":["../../../src/components/shad-cn-ui/SolidTooltip.tsx"],"names":[],"mappings":";AACA,OAAO,KAAK,OAAO,MAAM,yBAAyB,CAAC;AAqBnD,SAAS,EAAE;IAAC,eAA2C;SAA3C,UAA2C,EAA3C,qBAA2C,EAA3C,IAA2C;QAA3C,0BAA2C;;IACrD,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,IAAM,YAAY,GAAG,UAAC,EAKT;QAJlB,QAAQ,cAAA,EACR,WAAW,iBAAA,EACX,qBAAmB,EAAnB,aAAa,mBAAG,GAAG,KAAA,EACnB,yBAAuB,EAAvB,iBAAiB,mBAAG,GAAG,KAAA;IAEvB,OAAO,CACL,KAAC,OAAO,CAAC,QAAQ,IAAC,aAAa,EAAE,aAAa,EAAE,iBAAiB,EAAE,iBAAiB,YAClF,KAAC,OAAO,CAAC,IAAI,IAAC,WAAW,EAAE,WAAW,YAAG,QAAQ,GAAgB,GAChD,CACpB,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,mBAAmB,GAAG,UAAC,EAAuD;QAArD,QAAQ,cAAA,EAAE,eAAe,EAAf,OAAO,mBAAG,KAAK,KAAA;IAC7D,OAAO,KAAC,OAAO,CAAC,OAAO,IAAC,OAAO,EAAE,OAAO,YAAG,QAAQ,GAAmB,CAAC;AACzE,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,mBAAmB,GAAG,UAAC,EAKT;QAJzB,QAAQ,cAAA,EACR,YAAY,EAAZ,IAAI,mBAAG,KAAK,KAAA,EACZ,aAAgB,EAAhB,KAAK,mBAAG,QAAQ,KAAA,EAChB,SAAS,eAAA;IAET,OAAO,CACL,KAAC,OAAO,CAAC,MAAM,cACb,KAAC,OAAO,CAAC,OAAO,IACd,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,EAAE,CACX,uBAAuB,EACvB,SAAS,CACV,EACD,UAAU,EAAE,CAAC,YAEZ,QAAQ,GACO,GACH,CAClB,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import * as React from \"react\";\nimport * as Tooltip from \"@radix-ui/react-tooltip\";\n\ntype SolidTooltipProps = {\n children: React.ReactNode;\n defaultOpen?: boolean;\n delayDuration?: number;\n skipDelayDuration?: number;\n};\n\ntype SolidTooltipContentProps = {\n children: React.ReactNode;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n align?: \"start\" | \"center\" | \"end\";\n className?: string;\n};\n\ntype SolidTooltipTriggerProps = {\n children: React.ReactNode;\n asChild?: boolean;\n};\n\nfunction cx(...parts: Array<string | false | undefined>) {\n return parts.filter(Boolean).join(\" \");\n}\n\nexport const SolidTooltip = ({\n children,\n defaultOpen,\n delayDuration = 200,\n skipDelayDuration = 300,\n}: SolidTooltipProps) => {\n return (\n <Tooltip.Provider delayDuration={delayDuration} skipDelayDuration={skipDelayDuration}>\n <Tooltip.Root defaultOpen={defaultOpen}>{children}</Tooltip.Root>\n </Tooltip.Provider>\n );\n};\n\nexport const SolidTooltipTrigger = ({ children, asChild = false }: SolidTooltipTriggerProps) => {\n return <Tooltip.Trigger asChild={asChild}>{children}</Tooltip.Trigger>;\n};\n\nexport const SolidTooltipContent = ({\n children,\n side = \"top\",\n align = \"center\",\n className,\n}: SolidTooltipContentProps) => {\n return (\n <Tooltip.Portal>\n <Tooltip.Content\n side={side}\n align={align}\n className={cx(\n \"solid-tooltip-content\",\n className\n )}\n sideOffset={6}\n >\n {children}\n </Tooltip.Content>\n </Tooltip.Portal>\n );\n};\n"]}
1
+ {"version":3,"file":"SolidTooltip.js","sourceRoot":"","sources":["../../../src/components/shad-cn-ui/SolidTooltip.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as React from \"react\";\nimport * as Tooltip from \"@radix-ui/react-tooltip\";\nimport { SolidPopover, SolidPopoverContent, SolidPopoverTrigger } from \"./SolidPopover\";\n\ntype SolidTooltipProps = {\n children: React.ReactNode;\n defaultOpen?: boolean;\n delayDuration?: number;\n skipDelayDuration?: number;\n};\n\ntype SolidTooltipContentProps = {\n children: React.ReactNode;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n align?: \"start\" | \"center\" | \"end\";\n className?: string;\n};\n\ntype SolidTooltipTriggerProps = {\n children: React.ReactNode;\n asChild?: boolean;\n};\n\ntype SolidTooltipContextValue = {\n isTouchDevice: boolean;\n useTapPopover: boolean;\n setUseTapPopover: (value: boolean) => void;\n};\n\nconst SolidTooltipContext = React.createContext<SolidTooltipContextValue | null>(null);\n\nfunction cx(...parts: Array<string | false | undefined>) {\n return parts.filter(Boolean).join(\" \");\n}\n\nfunction canUseTapPopoverTrigger(children: React.ReactNode, asChild: boolean, isTouchDevice: boolean) {\n if (!isTouchDevice) {\n return false;\n }\n\n if (!asChild || !React.isValidElement(children)) {\n return true;\n }\n\n const childProps = children.props as Record<string, unknown>;\n\n return (\n typeof childProps.onClick !== \"function\" &&\n typeof childProps.href !== \"string\" &&\n typeof childProps.to !== \"string\"\n );\n}\n\nexport const SolidTooltip = ({\n children,\n defaultOpen,\n delayDuration = 200,\n skipDelayDuration = 300,\n}: SolidTooltipProps) => {\n const [isTouchDevice, setIsTouchDevice] = React.useState(false);\n const [useTapPopover, setUseTapPopover] = React.useState(false);\n\n React.useEffect(() => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return;\n }\n\n const touchMedia = window.matchMedia(\"(hover: none), (pointer: coarse)\");\n const updateMode = () => setIsTouchDevice(touchMedia.matches);\n\n updateMode();\n\n if (typeof touchMedia.addEventListener === \"function\") {\n touchMedia.addEventListener(\"change\", updateMode);\n return () => touchMedia.removeEventListener(\"change\", updateMode);\n }\n\n touchMedia.addListener(updateMode);\n return () => touchMedia.removeListener(updateMode);\n }, []);\n\n React.useEffect(() => {\n if (!isTouchDevice && useTapPopover) {\n setUseTapPopover(false);\n }\n }, [isTouchDevice, useTapPopover]);\n\n const content = (\n <SolidTooltipContext.Provider value={{ isTouchDevice, useTapPopover, setUseTapPopover }}>\n {children}\n </SolidTooltipContext.Provider>\n );\n\n if (isTouchDevice && useTapPopover) {\n return <SolidPopover autoCloseGroup=\"solid-tooltip\">{content}</SolidPopover>;\n }\n\n return (\n <Tooltip.Provider delayDuration={delayDuration} skipDelayDuration={skipDelayDuration}>\n <Tooltip.Root defaultOpen={defaultOpen}>{content}</Tooltip.Root>\n </Tooltip.Provider>\n );\n};\n\nexport const SolidTooltipTrigger = ({ children, asChild = false }: SolidTooltipTriggerProps) => {\n const context = React.useContext(SolidTooltipContext);\n const shouldUseTapPopover = canUseTapPopoverTrigger(children, asChild, context?.isTouchDevice ?? false);\n\n React.useEffect(() => {\n context?.setUseTapPopover(shouldUseTapPopover);\n }, [context, shouldUseTapPopover]);\n\n if (context?.useTapPopover) {\n return <SolidPopoverTrigger asChild={asChild}>{children}</SolidPopoverTrigger>;\n }\n\n return <Tooltip.Trigger asChild={asChild}>{children}</Tooltip.Trigger>;\n};\n\nexport const SolidTooltipContent = ({\n children,\n side = \"top\",\n align = \"center\",\n className,\n}: SolidTooltipContentProps) => {\n const context = React.useContext(SolidTooltipContext);\n\n if (context?.isTouchDevice && context.useTapPopover) {\n return (\n <SolidPopoverContent\n side={side}\n align={align}\n className={cx(\n \"solid-tooltip-content\",\n className\n )}\n sideOffset={6}\n >\n {children}\n </SolidPopoverContent>\n );\n }\n\n return (\n <Tooltip.Portal>\n <Tooltip.Content\n side={side}\n align={align}\n className={cx(\n \"solid-tooltip-content\",\n className\n )}\n sideOffset={6}\n >\n {children}\n </Tooltip.Content>\n </Tooltip.Portal>\n );\n};\n"]}
@@ -1,5 +1,6 @@
1
1
  import * as React from "react";
2
2
  import * as Tooltip from "@radix-ui/react-tooltip";
3
+ import { SolidPopover, SolidPopoverContent, SolidPopoverTrigger } from "./SolidPopover";
3
4
 
4
5
  type SolidTooltipProps = {
5
6
  children: React.ReactNode;
@@ -20,24 +21,99 @@ type SolidTooltipTriggerProps = {
20
21
  asChild?: boolean;
21
22
  };
22
23
 
24
+ type SolidTooltipContextValue = {
25
+ isTouchDevice: boolean;
26
+ useTapPopover: boolean;
27
+ setUseTapPopover: (value: boolean) => void;
28
+ };
29
+
30
+ const SolidTooltipContext = React.createContext<SolidTooltipContextValue | null>(null);
31
+
23
32
  function cx(...parts: Array<string | false | undefined>) {
24
33
  return parts.filter(Boolean).join(" ");
25
34
  }
26
35
 
36
+ function canUseTapPopoverTrigger(children: React.ReactNode, asChild: boolean, isTouchDevice: boolean) {
37
+ if (!isTouchDevice) {
38
+ return false;
39
+ }
40
+
41
+ if (!asChild || !React.isValidElement(children)) {
42
+ return true;
43
+ }
44
+
45
+ const childProps = children.props as Record<string, unknown>;
46
+
47
+ return (
48
+ typeof childProps.onClick !== "function" &&
49
+ typeof childProps.href !== "string" &&
50
+ typeof childProps.to !== "string"
51
+ );
52
+ }
53
+
27
54
  export const SolidTooltip = ({
28
55
  children,
29
56
  defaultOpen,
30
57
  delayDuration = 200,
31
58
  skipDelayDuration = 300,
32
59
  }: SolidTooltipProps) => {
60
+ const [isTouchDevice, setIsTouchDevice] = React.useState(false);
61
+ const [useTapPopover, setUseTapPopover] = React.useState(false);
62
+
63
+ React.useEffect(() => {
64
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") {
65
+ return;
66
+ }
67
+
68
+ const touchMedia = window.matchMedia("(hover: none), (pointer: coarse)");
69
+ const updateMode = () => setIsTouchDevice(touchMedia.matches);
70
+
71
+ updateMode();
72
+
73
+ if (typeof touchMedia.addEventListener === "function") {
74
+ touchMedia.addEventListener("change", updateMode);
75
+ return () => touchMedia.removeEventListener("change", updateMode);
76
+ }
77
+
78
+ touchMedia.addListener(updateMode);
79
+ return () => touchMedia.removeListener(updateMode);
80
+ }, []);
81
+
82
+ React.useEffect(() => {
83
+ if (!isTouchDevice && useTapPopover) {
84
+ setUseTapPopover(false);
85
+ }
86
+ }, [isTouchDevice, useTapPopover]);
87
+
88
+ const content = (
89
+ <SolidTooltipContext.Provider value={{ isTouchDevice, useTapPopover, setUseTapPopover }}>
90
+ {children}
91
+ </SolidTooltipContext.Provider>
92
+ );
93
+
94
+ if (isTouchDevice && useTapPopover) {
95
+ return <SolidPopover autoCloseGroup="solid-tooltip">{content}</SolidPopover>;
96
+ }
97
+
33
98
  return (
34
99
  <Tooltip.Provider delayDuration={delayDuration} skipDelayDuration={skipDelayDuration}>
35
- <Tooltip.Root defaultOpen={defaultOpen}>{children}</Tooltip.Root>
100
+ <Tooltip.Root defaultOpen={defaultOpen}>{content}</Tooltip.Root>
36
101
  </Tooltip.Provider>
37
102
  );
38
103
  };
39
104
 
40
105
  export const SolidTooltipTrigger = ({ children, asChild = false }: SolidTooltipTriggerProps) => {
106
+ const context = React.useContext(SolidTooltipContext);
107
+ const shouldUseTapPopover = canUseTapPopoverTrigger(children, asChild, context?.isTouchDevice ?? false);
108
+
109
+ React.useEffect(() => {
110
+ context?.setUseTapPopover(shouldUseTapPopover);
111
+ }, [context, shouldUseTapPopover]);
112
+
113
+ if (context?.useTapPopover) {
114
+ return <SolidPopoverTrigger asChild={asChild}>{children}</SolidPopoverTrigger>;
115
+ }
116
+
41
117
  return <Tooltip.Trigger asChild={asChild}>{children}</Tooltip.Trigger>;
42
118
  };
43
119
 
@@ -47,6 +123,24 @@ export const SolidTooltipContent = ({
47
123
  align = "center",
48
124
  className,
49
125
  }: SolidTooltipContentProps) => {
126
+ const context = React.useContext(SolidTooltipContext);
127
+
128
+ if (context?.isTouchDevice && context.useTapPopover) {
129
+ return (
130
+ <SolidPopoverContent
131
+ side={side}
132
+ align={align}
133
+ className={cx(
134
+ "solid-tooltip-content",
135
+ className
136
+ )}
137
+ sideOffset={6}
138
+ >
139
+ {children}
140
+ </SolidPopoverContent>
141
+ );
142
+ }
143
+
50
144
  return (
51
145
  <Tooltip.Portal>
52
146
  <Tooltip.Content
@@ -1 +1 @@
1
- {"version":3,"file":"downloadMediaFile.d.ts","sourceRoot":"","sources":["../../src/helpers/downloadMediaFile.tsx"],"names":[],"mappings":"AAWA,eAAO,MAAM,iBAAiB,YAAa,MAAM,aAAa,MAAM,SAMnE,CAAC"}
1
+ {"version":3,"file":"downloadMediaFile.d.ts","sourceRoot":"","sources":["../../src/helpers/downloadMediaFile.tsx"],"names":[],"mappings":"AAsCA,eAAO,MAAM,iBAAiB,YAAa,MAAM,aAAa,MAAM,SAMnE,CAAC"}
@@ -1,17 +1,92 @@
1
- var triggerBrowserDownload = function (url, fileName) {
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
12
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ var triggerLinkClick = function (href, fileName, openInNewTab) {
38
+ if (openInNewTab === void 0) { openInNewTab = false; }
2
39
  var link = document.createElement("a");
3
- var downloadUrl = new URL(url, window.location.origin);
4
- downloadUrl.searchParams.set("disposition", "attachment");
5
- link.href = downloadUrl.toString();
40
+ link.href = href;
41
+ if (openInNewTab) {
42
+ link.target = "_blank";
43
+ link.rel = "noopener noreferrer";
44
+ }
6
45
  link.download = fileName || "";
7
46
  document.body.appendChild(link);
8
47
  link.click();
9
48
  document.body.removeChild(link);
10
49
  };
50
+ // Anchor `download` attribute is ignored by browsers for cross-origin URLs
51
+ // (e.g. S3), so cross-origin media would open inline instead of downloading.
52
+ // Mutating the URL's query params also breaks presigned S3 URLs, since the
53
+ // signature is computed over the exact query string at signing time.
54
+ // Fetching the file and downloading it via a same-origin blob: URL avoids both issues.
55
+ var triggerBrowserDownload = function (url, fileName) { return __awaiter(void 0, void 0, void 0, function () {
56
+ var response, blob, blobUrl, e_1;
57
+ return __generator(this, function (_a) {
58
+ switch (_a.label) {
59
+ case 0:
60
+ _a.trys.push([0, 3, , 4]);
61
+ return [4 /*yield*/, fetch(url)];
62
+ case 1:
63
+ response = _a.sent();
64
+ if (!response.ok) {
65
+ throw new Error("Failed to fetch file: ".concat(response.status));
66
+ }
67
+ return [4 /*yield*/, response.blob()];
68
+ case 2:
69
+ blob = _a.sent();
70
+ blobUrl = URL.createObjectURL(blob);
71
+ triggerLinkClick(blobUrl, fileName);
72
+ URL.revokeObjectURL(blobUrl);
73
+ return [3 /*break*/, 4];
74
+ case 3:
75
+ e_1 = _a.sent();
76
+ console.error("Failed to download file via fetch, falling back to direct link:", e_1);
77
+ // Fallback for cases fetch can't handle (e.g. no CORS on the host).
78
+ // This won't force a download for cross-origin URLs, but it's the
79
+ // best available option when the blob fetch fails.
80
+ triggerLinkClick(url, fileName, true);
81
+ return [3 /*break*/, 4];
82
+ case 4: return [2 /*return*/];
83
+ }
84
+ });
85
+ }); };
11
86
  export var downloadMediaFile = function (fileUrl, fileName) {
12
87
  if (!fileUrl) {
13
88
  return;
14
89
  }
15
- triggerBrowserDownload(fileUrl, fileName);
90
+ void triggerBrowserDownload(fileUrl, fileName);
16
91
  };
17
92
  //# sourceMappingURL=downloadMediaFile.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"downloadMediaFile.js","sourceRoot":"","sources":["../../src/helpers/downloadMediaFile.tsx"],"names":[],"mappings":"AAAA,IAAM,sBAAsB,GAAG,UAAC,GAAW,EAAE,QAAiB;IAC1D,IAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACzC,IAAM,WAAW,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzD,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC1D,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC;IACnC,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,EAAE,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAK;IACjB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC,CAAC;AAEF,MAAM,CAAC,IAAM,iBAAiB,GAAG,UAAC,OAAe,EAAE,QAAiB;IAChE,IAAI,CAAC,OAAO,EAAE;QACV,OAAO;KACV;IAED,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC,CAAC","sourcesContent":["const triggerBrowserDownload = (url: string, fileName?: string) => {\n const link = document.createElement(\"a\");\n const downloadUrl = new URL(url, window.location.origin);\n downloadUrl.searchParams.set(\"disposition\", \"attachment\");\n link.href = downloadUrl.toString();\n link.download = fileName || \"\";\n document.body.appendChild(link);\n link.click() ;\n document.body.removeChild(link);\n};\n\nexport const downloadMediaFile = (fileUrl: string, fileName?: string) => {\n if (!fileUrl) {\n return;\n }\n\n triggerBrowserDownload(fileUrl, fileName);\n};\n"]}
1
+ {"version":3,"file":"downloadMediaFile.js","sourceRoot":"","sources":["../../src/helpers/downloadMediaFile.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAM,gBAAgB,GAAG,UAAC,IAAY,EAAE,QAAiB,EAAE,YAAoB;IAApB,6BAAA,EAAA,oBAAoB;IAC3E,IAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAEjB,IAAI,YAAY,EAAE;QACd,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;QACvB,IAAI,CAAC,GAAG,GAAG,qBAAqB,CAAC;KACpC;IACD,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,EAAE,CAAC;IAC/B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,EAAE,CAAC;IACb,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC,CAAC;AAEF,2EAA2E;AAC3E,6EAA6E;AAC7E,2EAA2E;AAC3E,qEAAqE;AACrE,uFAAuF;AACvF,IAAM,sBAAsB,GAAG,UAAO,GAAW,EAAE,QAAiB;;;;;;gBAE3C,qBAAM,KAAK,CAAC,GAAG,CAAC,EAAA;;gBAA3B,QAAQ,GAAG,SAAgB;gBACjC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;oBACd,MAAM,IAAI,KAAK,CAAC,gCAAyB,QAAQ,CAAC,MAAM,CAAE,CAAC,CAAC;iBAC/D;gBACY,qBAAM,QAAQ,CAAC,IAAI,EAAE,EAAA;;gBAA5B,IAAI,GAAG,SAAqB;gBAC5B,OAAO,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBAC1C,gBAAgB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBACpC,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;;;;gBAE7B,OAAO,CAAC,KAAK,CAAC,iEAAiE,EAAE,GAAC,CAAC,CAAC;gBACpF,oEAAoE;gBACpE,kEAAkE;gBAClE,mDAAmD;gBACnD,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;;;;;KAE7C,CAAC;AAEF,MAAM,CAAC,IAAM,iBAAiB,GAAG,UAAC,OAAe,EAAE,QAAiB;IAChE,IAAI,CAAC,OAAO,EAAE;QACV,OAAO;KACV;IAED,KAAK,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AACnD,CAAC,CAAC","sourcesContent":["const triggerLinkClick = (href: string, fileName?: string, openInNewTab = false) => {\n const link = document.createElement(\"a\");\n link.href = href;\n\n if (openInNewTab) {\n link.target = \"_blank\";\n link.rel = \"noopener noreferrer\";\n }\n link.download = fileName || \"\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n};\n\n// Anchor `download` attribute is ignored by browsers for cross-origin URLs\n// (e.g. S3), so cross-origin media would open inline instead of downloading.\n// Mutating the URL's query params also breaks presigned S3 URLs, since the\n// signature is computed over the exact query string at signing time.\n// Fetching the file and downloading it via a same-origin blob: URL avoids both issues.\nconst triggerBrowserDownload = async (url: string, fileName?: string) => {\n try {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch file: ${response.status}`);\n }\n const blob = await response.blob();\n const blobUrl = URL.createObjectURL(blob);\n triggerLinkClick(blobUrl, fileName);\n URL.revokeObjectURL(blobUrl);\n } catch(e) {\n console.error(\"Failed to download file via fetch, falling back to direct link:\", e);\n // Fallback for cases fetch can't handle (e.g. no CORS on the host).\n // This won't force a download for cross-origin URLs, but it's the\n // best available option when the blob fetch fails.\n triggerLinkClick(url, fileName, true);\n }\n};\n\nexport const downloadMediaFile = (fileUrl: string, fileName?: string) => {\n if (!fileUrl) {\n return;\n }\n\n void triggerBrowserDownload(fileUrl, fileName);\n};\n"]}
@@ -1,18 +1,45 @@
1
- const triggerBrowserDownload = (url: string, fileName?: string) => {
1
+ const triggerLinkClick = (href: string, fileName?: string, openInNewTab = false) => {
2
2
  const link = document.createElement("a");
3
- const downloadUrl = new URL(url, window.location.origin);
4
- downloadUrl.searchParams.set("disposition", "attachment");
5
- link.href = downloadUrl.toString();
3
+ link.href = href;
4
+
5
+ if (openInNewTab) {
6
+ link.target = "_blank";
7
+ link.rel = "noopener noreferrer";
8
+ }
6
9
  link.download = fileName || "";
7
10
  document.body.appendChild(link);
8
- link.click() ;
11
+ link.click();
9
12
  document.body.removeChild(link);
10
13
  };
11
14
 
15
+ // Anchor `download` attribute is ignored by browsers for cross-origin URLs
16
+ // (e.g. S3), so cross-origin media would open inline instead of downloading.
17
+ // Mutating the URL's query params also breaks presigned S3 URLs, since the
18
+ // signature is computed over the exact query string at signing time.
19
+ // Fetching the file and downloading it via a same-origin blob: URL avoids both issues.
20
+ const triggerBrowserDownload = async (url: string, fileName?: string) => {
21
+ try {
22
+ const response = await fetch(url);
23
+ if (!response.ok) {
24
+ throw new Error(`Failed to fetch file: ${response.status}`);
25
+ }
26
+ const blob = await response.blob();
27
+ const blobUrl = URL.createObjectURL(blob);
28
+ triggerLinkClick(blobUrl, fileName);
29
+ URL.revokeObjectURL(blobUrl);
30
+ } catch(e) {
31
+ console.error("Failed to download file via fetch, falling back to direct link:", e);
32
+ // Fallback for cases fetch can't handle (e.g. no CORS on the host).
33
+ // This won't force a download for cross-origin URLs, but it's the
34
+ // best available option when the blob fetch fails.
35
+ triggerLinkClick(url, fileName, true);
36
+ }
37
+ };
38
+
12
39
  export const downloadMediaFile = (fileUrl: string, fileName?: string) => {
13
40
  if (!fileUrl) {
14
41
  return;
15
42
  }
16
43
 
17
- triggerBrowserDownload(fileUrl, fileName);
44
+ void triggerBrowserDownload(fileUrl, fileName);
18
45
  };