@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.
- package/dist/components/auth/AuthTabs.d.ts.map +1 -1
- package/dist/components/auth/AuthTabs.js +1 -1
- package/dist/components/auth/AuthTabs.js.map +1 -1
- package/dist/components/auth/AuthTabs.tsx +1 -0
- package/dist/components/auth/SolidChangeForcePassword.d.ts.map +1 -1
- package/dist/components/auth/SolidChangeForcePassword.js +2 -2
- package/dist/components/auth/SolidChangeForcePassword.js.map +1 -1
- package/dist/components/auth/SolidChangeForcePassword.tsx +9 -8
- package/dist/components/common/SettingsComponent.d.ts.map +1 -1
- package/dist/components/common/SettingsComponent.js +1 -1
- package/dist/components/common/SettingsComponent.js.map +1 -1
- package/dist/components/common/SettingsComponent.tsx +1 -0
- package/dist/components/common/SolidFieldTooltip.d.ts.map +1 -1
- package/dist/components/common/SolidFieldTooltip.js +1 -33
- package/dist/components/common/SolidFieldTooltip.js.map +1 -1
- package/dist/components/common/SolidFieldTooltip.tsx +8 -64
- package/dist/components/common/SolidMaterialSymbol.d.ts +1 -1
- package/dist/components/common/SolidMaterialSymbol.d.ts.map +1 -1
- package/dist/components/common/SolidMaterialSymbol.js +6 -37
- package/dist/components/common/SolidMaterialSymbol.js.map +1 -1
- package/dist/components/common/SolidMaterialSymbol.tsx +6 -54
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.d.ts.map +1 -1
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js +2 -2
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.js.map +1 -1
- package/dist/components/common/SolidSettings/LlmSettings/AiModelConfigTab.tsx +2 -0
- package/dist/components/core/card/CardItem.d.ts.map +1 -1
- package/dist/components/core/card/CardItem.js +1 -1
- package/dist/components/core/card/CardItem.js.map +1 -1
- package/dist/components/core/card/CardItem.tsx +16 -14
- package/dist/components/core/card/SolidCardView.d.ts.map +1 -1
- package/dist/components/core/card/SolidCardView.js +69 -40
- package/dist/components/core/card/SolidCardView.js.map +1 -1
- package/dist/components/core/card/SolidCardView.tsx +55 -24
- package/dist/components/core/common/SolidAccountSettings/SolidAccountSettings.module.css +99 -0
- package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.d.ts.map +1 -1
- package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.js +76 -5
- package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.js.map +1 -1
- package/dist/components/core/common/SolidAccountSettings/SolidVersionInfo.tsx +39 -4
- package/dist/components/core/common/SolidGlobalSearchElement.d.ts.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.js +172 -124
- package/dist/components/core/common/SolidGlobalSearchElement.js.map +1 -1
- package/dist/components/core/common/SolidGlobalSearchElement.tsx +73 -84
- package/dist/components/core/common/globalSearchPersistence.d.ts +3 -0
- package/dist/components/core/common/globalSearchPersistence.d.ts.map +1 -1
- package/dist/components/core/common/globalSearchPersistence.js +33 -24
- package/dist/components/core/common/globalSearchPersistence.js.map +1 -1
- package/dist/components/core/common/globalSearchPersistence.ts +34 -27
- package/dist/components/core/filter/fields/SolidMediaMultipleField.js +2 -2
- package/dist/components/core/filter/fields/SolidMediaMultipleField.js.map +1 -1
- package/dist/components/core/filter/fields/SolidMediaMultipleField.tsx +2 -2
- package/dist/components/core/filter/fields/SolidMediaSingleField.js +2 -2
- package/dist/components/core/filter/fields/SolidMediaSingleField.js.map +1 -1
- package/dist/components/core/filter/fields/SolidMediaSingleField.tsx +2 -2
- package/dist/components/core/filter/fields/SolidShortTextField.js +2 -2
- package/dist/components/core/filter/fields/SolidShortTextField.js.map +1 -1
- package/dist/components/core/filter/fields/SolidShortTextField.tsx +2 -2
- package/dist/components/core/kanban/KanbanCard.d.ts.map +1 -1
- package/dist/components/core/kanban/KanbanCard.js +1 -1
- package/dist/components/core/kanban/KanbanCard.js.map +1 -1
- package/dist/components/core/kanban/KanbanCard.tsx +18 -16
- package/dist/components/core/kanban/SolidKanbanView.d.ts.map +1 -1
- package/dist/components/core/kanban/SolidKanbanView.js +67 -48
- package/dist/components/core/kanban/SolidKanbanView.js.map +1 -1
- package/dist/components/core/kanban/SolidKanbanView.tsx +51 -11
- package/dist/components/core/kanban/SolidKanbanViewConfigure.d.ts +1 -1
- package/dist/components/core/kanban/SolidKanbanViewConfigure.d.ts.map +1 -1
- package/dist/components/core/kanban/SolidKanbanViewConfigure.js +11 -2
- package/dist/components/core/kanban/SolidKanbanViewConfigure.js.map +1 -1
- package/dist/components/core/kanban/SolidKanbanViewConfigure.tsx +35 -0
- package/dist/components/core/list/SolidListView.d.ts.map +1 -1
- package/dist/components/core/list/SolidListView.js +6 -2
- package/dist/components/core/list/SolidListView.js.map +1 -1
- package/dist/components/core/list/SolidListView.tsx +7 -1
- package/dist/components/core/list/SolidListViewConfigure.d.ts.map +1 -1
- package/dist/components/core/list/SolidListViewConfigure.js +15 -11
- package/dist/components/core/list/SolidListViewConfigure.js.map +1 -1
- package/dist/components/core/list/SolidListViewConfigure.tsx +25 -6
- package/dist/components/core/list/SolidListViewHeaderContextMenuButton.d.ts +1 -1
- package/dist/components/core/list/SolidListViewHeaderContextMenuButton.d.ts.map +1 -1
- package/dist/components/core/list/SolidListViewHeaderContextMenuButton.js +3 -1
- package/dist/components/core/list/SolidListViewHeaderContextMenuButton.js.map +1 -1
- package/dist/components/core/list/SolidListViewHeaderContextMenuButton.tsx +3 -1
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.js +7 -0
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidMediaMultipleColumn.tsx +5 -0
- package/dist/components/core/list/columns/SolidMediaSingleColumn.d.ts.map +1 -1
- package/dist/components/core/list/columns/SolidMediaSingleColumn.js +3 -0
- package/dist/components/core/list/columns/SolidMediaSingleColumn.js.map +1 -1
- package/dist/components/core/list/columns/SolidMediaSingleColumn.tsx +2 -0
- package/dist/components/core/list/widgets/SolidShortTextFieldImageRenderModeWidget.d.ts.map +1 -1
- package/dist/components/core/list/widgets/SolidShortTextFieldImageRenderModeWidget.js +3 -0
- package/dist/components/core/list/widgets/SolidShortTextFieldImageRenderModeWidget.js.map +1 -1
- package/dist/components/core/list/widgets/SolidShortTextFieldImageRenderModeWidget.tsx +2 -0
- package/dist/components/core/model/CreateModel.css +10 -0
- package/dist/components/core/model/FieldMetaDataForm.css +10 -0
- package/dist/components/core/model/FieldMetaDataForm.js +8 -8
- package/dist/components/core/model/FieldMetaDataForm.js.map +1 -1
- package/dist/components/core/model/FieldMetaDataForm.tsx +13 -13
- package/dist/components/core/module/ModuleMetadataExplorer.css +23 -0
- package/dist/components/core/module/ModuleMetadataExplorer.d.ts.map +1 -1
- package/dist/components/core/module/ModuleMetadataExplorer.js +1 -1
- package/dist/components/core/module/ModuleMetadataExplorer.js.map +1 -1
- package/dist/components/core/module/ModuleMetadataExplorer.tsx +9 -0
- package/dist/components/core/tree/SolidTreeView.d.ts.map +1 -1
- package/dist/components/core/tree/SolidTreeView.js +249 -138
- package/dist/components/core/tree/SolidTreeView.js.map +1 -1
- package/dist/components/core/tree/SolidTreeView.tsx +220 -92
- package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.d.ts.map +1 -1
- package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.js +1 -1
- package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.js.map +1 -1
- package/dist/components/core/users/ApiKeysTab/GenerateApiKeyModal.tsx +1 -0
- package/dist/components/layout/AdminHeaderActions.js +6 -13
- package/dist/components/layout/AdminHeaderActions.js.map +1 -1
- package/dist/components/layout/AdminHeaderActions.tsx +11 -11
- package/dist/components/layout/AdminLayout.d.ts.map +1 -1
- package/dist/components/layout/AdminLayout.js +2 -2
- package/dist/components/layout/AdminLayout.js.map +1 -1
- package/dist/components/layout/AdminLayout.tsx +5 -4
- package/dist/components/layout/AppSidebar.d.ts.map +1 -1
- package/dist/components/layout/AppSidebar.js +17 -2
- package/dist/components/layout/AppSidebar.js.map +1 -1
- package/dist/components/layout/AppSidebar.tsx +21 -2
- package/dist/components/shad-cn-ui/SolidDatePicker.d.ts +1 -1
- package/dist/components/shad-cn-ui/SolidDatePicker.d.ts.map +1 -1
- package/dist/components/shad-cn-ui/SolidDatePicker.js +35 -3
- package/dist/components/shad-cn-ui/SolidDatePicker.js.map +1 -1
- package/dist/components/shad-cn-ui/SolidDatePicker.tsx +84 -0
- package/dist/components/shad-cn-ui/SolidTooltip.d.ts.map +1 -1
- package/dist/components/shad-cn-ui/SolidTooltip.js +55 -2
- package/dist/components/shad-cn-ui/SolidTooltip.js.map +1 -1
- package/dist/components/shad-cn-ui/SolidTooltip.tsx +95 -1
- package/dist/helpers/downloadMediaFile.d.ts.map +1 -1
- package/dist/helpers/downloadMediaFile.js +80 -5
- package/dist/helpers/downloadMediaFile.js.map +1 -1
- package/dist/helpers/downloadMediaFile.tsx +33 -6
- package/dist/resources/globals.css +109 -1
- package/dist/resources/solid-custom.css +53 -3
- package/dist/resources/solid-tailwind-generated.css +1 -1
- package/dist/routes/pages/admin/core/DashboardPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/DashboardPage.js +2 -2
- package/dist/routes/pages/admin/core/DashboardPage.js.map +1 -1
- package/dist/routes/pages/admin/core/DashboardPage.tsx +2 -0
- package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.d.ts.map +1 -1
- package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.js +1 -1
- package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.js.map +1 -1
- package/dist/routes/pages/admin/core/DatasourceIntrospectionPage.tsx +1 -0
- package/dist/types/css-modules.d.ts +2 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolidDatePicker.js","sourceRoot":"","sources":["../../../src/components/shad-cn-ui/SolidDatePicker.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,eAAe,MAAM,kBAAkB,CAAC;AAC/C,OAAO,4CAA4C,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAW1C,SAAS,eAAe,CAAC,KAA8B,EAAE,OAAgB;IACvE,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,YAAY,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE;QACvE,OAAO,EAAE,CAAC;KACX;IACD,IAAI,CAAC,OAAO,EAAE;QACZ,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;KAC5B;IACD,IAAM,GAAG,GAAG,UAAC,GAAW,EAAE,MAAU;QAAV,uBAAA,EAAA,UAAU;QAAK,OAAA,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC;IAAjC,CAAiC,CAAC;IAC3E,IAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC/B,IAAM,OAAO,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;IACnC,IAAM,OAAO,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;IACnC,IAAM,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,IAAM,GAAG,GAAG,KAAK,GAAG,EAAE,IAAI,EAAE,CAAC;IAE7B,OAAO,OAAO;SACX,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;SAC7C,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;SACzC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;SACpC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;SAC1B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;SACxB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;SAC1B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;SAC5B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;SAC5B,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,IAAM,oBAAoB,GAAG,KAAK,CAAC,UAAU,CAC3C,UAAC,EAAqC,EAAE,GAAG;IAAxC,IAAA,SAAS,eAAA,EAAE,YAAY,kBAAA,EAAK,KAAK,cAAnC,6BAAqC,CAAF;IAAY,OAAA,CAC9C,KAAC,UAAU,aACT,GAAG,EAAE,GAAG,IACJ,KAAK,IACT,KAAK,EAAE,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,CAAC,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAC3E,QAAQ,QACR,SAAS,EAAE,SAAS,IACpB,CACH,CAAA;CAAA,CACF,CAAC;AAEF,oBAAoB,CAAC,WAAW,GAAG,sBAAsB,CAAC;AAE1D,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,UAAU,eAAe,CAAC,EAUT;;IATrB,IAAA,QAAQ,cAAA,EACR,cAAc,oBAAA,EACd,cAAc,oBAAA,EACd,QAAQ,cAAA,EACR,UAAU,gBAAA,EACV,iBAAiB,uBAAA,EACjB,eAAe,qBAAA,EACf,SAAS,eAAA,EACN,KAAK,cATsB,+HAU/B,CADS;IAER,IAAM,gBAAgB,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC;IAC1D,IAAM,cAAc,GAAG,MAAA,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,mCAAI,YAAY,CAAC;IAChG,IAAM,YAAY,GAAG,eAAe,CAAC,QAAmC,EAAE,cAAc,CAAC,CAAC;IAE1F,OAAO,CACL,KAAC,eAAe,aACd,WAAW,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,EAClC,eAAe,EAAC,cAAc,IAC1B,KAAK,IACT,QAAQ,EAAE,QAAQ,EAClB,cAAc,EAAE,gBAAgB,EAChC,kBAAkB,EAAE,QAAQ,EAC5B,iBAAiB,EAAE,EAAE,CAAC,iCAAiC,EAAE,iBAAiB,CAAC,EAC3E,eAAe,EAAE,EAAE,CAAC,+BAA+B,EAAE,eAAe,CAAC,EACrE,WAAW,EAAE,KAAC,oBAAoB,IAAC,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,GAAI,EAC5F,SAAS,EAAE,EAAE,CAAC,kBAAkB,EAAE,SAAS,CAAC,IAC5C,CACH,CAAC;AACJ,CAAC","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;
|
|
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
|
-
|
|
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
|
|
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":";
|
|
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}>{
|
|
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":"
|
|
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
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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,
|
|
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
|
|
1
|
+
const triggerLinkClick = (href: string, fileName?: string, openInNewTab = false) => {
|
|
2
2
|
const link = document.createElement("a");
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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
|
};
|