@j-solution/components 1.6.1 → 1.8.0
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/README.md +8 -6
- package/assets/jwms-portal-frontend-BtHTA-UF.css +1 -0
- package/assets/styles/global-utilities.css +34 -0
- package/assets/styles/j-components.css +1 -1
- package/assets/styles/themes.css +128 -21
- package/components/atoms/JAvatar.vue.cjs +1 -1
- package/components/atoms/JAvatar.vue.cjs.map +1 -1
- package/components/atoms/JAvatar.vue.js +10 -7
- package/components/atoms/JAvatar.vue.js.map +1 -1
- package/components/atoms/JBadge.vue.cjs +1 -1
- package/components/atoms/JBadge.vue.cjs.map +1 -1
- package/components/atoms/JBadge.vue.js +7 -6
- package/components/atoms/JBadge.vue.js.map +1 -1
- package/components/atoms/JButton.vue.cjs +6 -1
- package/components/atoms/JButton.vue.cjs.map +1 -1
- package/components/atoms/JButton.vue.js +10 -85
- package/components/atoms/JButton.vue.js.map +1 -1
- package/components/atoms/JButton.vue2.cjs +1 -1
- package/components/atoms/JButton.vue2.cjs.map +1 -1
- package/components/atoms/JButton.vue2.js +85 -2
- package/components/atoms/JButton.vue2.js.map +1 -1
- package/components/atoms/JDatepicker.vue.cjs +1 -1
- package/components/atoms/JDatepicker.vue.cjs.map +1 -1
- package/components/atoms/JDatepicker.vue.js +10 -10
- package/components/atoms/JDatepicker.vue.js.map +1 -1
- package/components/atoms/JEditor.vue.cjs +1 -1
- package/components/atoms/JEditor.vue.js +1 -1
- package/components/atoms/JEditor.vue2.cjs +1 -1
- package/components/atoms/JEditor.vue2.cjs.map +1 -1
- package/components/atoms/JEditor.vue2.js +31 -17
- package/components/atoms/JEditor.vue2.js.map +1 -1
- package/components/atoms/JGrid.vue.cjs +1 -1
- package/components/atoms/JGrid.vue.js +2 -2
- package/components/atoms/JGrid.vue2.cjs +1 -1
- package/components/atoms/JGrid.vue2.cjs.map +1 -1
- package/components/atoms/JGrid.vue2.js +59 -43
- package/components/atoms/JGrid.vue2.js.map +1 -1
- package/components/atoms/JIcon.vue.cjs +1 -1
- package/components/atoms/JIcon.vue.cjs.map +1 -1
- package/components/atoms/JIcon.vue.js +14 -13
- package/components/atoms/JIcon.vue.js.map +1 -1
- package/components/atoms/JKbd.vue.cjs +1 -1
- package/components/atoms/JKbd.vue.cjs.map +1 -1
- package/components/atoms/JKbd.vue.js +13 -10
- package/components/atoms/JKbd.vue.js.map +1 -1
- package/components/atoms/JLabel.vue.cjs +1 -1
- package/components/atoms/JLabel.vue.cjs.map +1 -1
- package/components/atoms/JLabel.vue.js +26 -22
- package/components/atoms/JLabel.vue.js.map +1 -1
- package/components/atoms/JLink.vue.cjs +1 -1
- package/components/atoms/JLink.vue.cjs.map +1 -1
- package/components/atoms/JLink.vue.js +5 -5
- package/components/atoms/JLink.vue.js.map +1 -1
- package/components/atoms/JPreview.vue.cjs +1 -1
- package/components/atoms/JPreview.vue.js +2 -2
- package/components/atoms/JPreview.vue2.cjs +1 -1
- package/components/atoms/JPreview.vue2.cjs.map +1 -1
- package/components/atoms/JPreview.vue2.js +33 -20
- package/components/atoms/JPreview.vue2.js.map +1 -1
- package/components/atoms/JProgress.vue.cjs +1 -1
- package/components/atoms/JProgress.vue.cjs.map +1 -1
- package/components/atoms/JProgress.vue.js +15 -9
- package/components/atoms/JProgress.vue.js.map +1 -1
- package/components/atoms/JRadio.vue.cjs +1 -1
- package/components/atoms/JRadio.vue.cjs.map +1 -1
- package/components/atoms/JRadio.vue.js +1 -1
- package/components/atoms/JRadio.vue.js.map +1 -1
- package/components/atoms/JSearchCombo.vue.cjs +1 -1
- package/components/atoms/JSearchCombo.vue.cjs.map +1 -1
- package/components/atoms/JSearchCombo.vue.js +38 -37
- package/components/atoms/JSearchCombo.vue.js.map +1 -1
- package/components/atoms/JSectionTitle.vue.cjs +7 -0
- package/components/atoms/JSectionTitle.vue.cjs.map +1 -0
- package/components/atoms/JSectionTitle.vue.js +13 -0
- package/components/atoms/JSectionTitle.vue.js.map +1 -0
- package/components/atoms/JSectionTitle.vue2.cjs +2 -0
- package/components/atoms/JSectionTitle.vue2.cjs.map +1 -0
- package/components/atoms/JSectionTitle.vue2.js +67 -0
- package/components/atoms/JSectionTitle.vue2.js.map +1 -0
- package/components/atoms/JSpinner.vue.cjs +1 -1
- package/components/atoms/JSpinner.vue.cjs.map +1 -1
- package/components/atoms/JSpinner.vue.js +8 -7
- package/components/atoms/JSpinner.vue.js.map +1 -1
- package/components/atoms/JSplitter.vue.cjs +6 -1
- package/components/atoms/JSplitter.vue.cjs.map +1 -1
- package/components/atoms/JSplitter.vue.js +10 -54
- package/components/atoms/JSplitter.vue.js.map +1 -1
- package/components/atoms/JSplitter.vue2.cjs +1 -1
- package/components/atoms/JSplitter.vue2.cjs.map +1 -1
- package/components/atoms/JSplitter.vue2.js +59 -2
- package/components/atoms/JSplitter.vue2.js.map +1 -1
- package/components/atoms/JTooltip.vue.cjs +1 -1
- package/components/atoms/JTooltip.vue.cjs.map +1 -1
- package/components/atoms/JTooltip.vue.js +18 -15
- package/components/atoms/JTooltip.vue.js.map +1 -1
- package/components/examples/ExampleCrudPage.vue.cjs +1 -1
- package/components/examples/ExampleCrudPage.vue.cjs.map +1 -1
- package/components/examples/ExampleCrudPage.vue.js +265 -191
- package/components/examples/ExampleCrudPage.vue.js.map +1 -1
- package/components/examples/ExampleTabMappingPage.vue.cjs +1 -1
- package/components/examples/ExampleTabMappingPage.vue.cjs.map +1 -1
- package/components/examples/ExampleTabMappingPage.vue.js +349 -333
- package/components/examples/ExampleTabMappingPage.vue.js.map +1 -1
- package/components/molecules/JAlert.vue.cjs +1 -1
- package/components/molecules/JAlert.vue.cjs.map +1 -1
- package/components/molecules/JAlert.vue.js +18 -16
- package/components/molecules/JAlert.vue.js.map +1 -1
- package/components/molecules/JBreadcrumb.vue.cjs +1 -1
- package/components/molecules/JBreadcrumb.vue.cjs.map +1 -1
- package/components/molecules/JBreadcrumb.vue.js +3 -3
- package/components/molecules/JBreadcrumb.vue.js.map +1 -1
- package/components/molecules/JCard.vue.cjs +1 -1
- package/components/molecules/JCard.vue.cjs.map +1 -1
- package/components/molecules/JCard.vue.js +55 -39
- package/components/molecules/JCard.vue.js.map +1 -1
- package/components/molecules/JEmptyState.vue.cjs +7 -0
- package/components/molecules/JEmptyState.vue.cjs.map +1 -0
- package/components/molecules/JEmptyState.vue.js +13 -0
- package/components/molecules/JEmptyState.vue.js.map +1 -0
- package/components/molecules/JEmptyState.vue2.cjs +2 -0
- package/components/molecules/JEmptyState.vue2.cjs.map +1 -0
- package/components/molecules/JEmptyState.vue2.js +127 -0
- package/components/molecules/JEmptyState.vue2.js.map +1 -0
- package/components/molecules/JFormField.vue.cjs +6 -1
- package/components/molecules/JFormField.vue.cjs.map +1 -1
- package/components/molecules/JFormField.vue.js +10 -262
- package/components/molecules/JFormField.vue.js.map +1 -1
- package/components/molecules/JFormField.vue2.cjs +2 -0
- package/components/molecules/JFormField.vue2.cjs.map +1 -0
- package/components/molecules/JFormField.vue2.js +271 -0
- package/components/molecules/JFormField.vue2.js.map +1 -0
- package/components/molecules/JTabs.vue.cjs +1 -1
- package/components/molecules/JTabs.vue.js +1 -1
- package/components/molecules/JTabs.vue2.cjs +1 -1
- package/components/molecules/JTabs.vue2.cjs.map +1 -1
- package/components/molecules/JTabs.vue2.js +50 -56
- package/components/molecules/JTabs.vue2.js.map +1 -1
- package/components/molecules/JTitlebar.vue.cjs +1 -1
- package/components/molecules/JTitlebar.vue.cjs.map +1 -1
- package/components/molecules/JTitlebar.vue.js +49 -47
- package/components/molecules/JTitlebar.vue.js.map +1 -1
- package/components/organisms/JDynamicForm.vue2.cjs +1 -1
- package/components/organisms/JDynamicForm.vue2.cjs.map +1 -1
- package/components/organisms/JDynamicForm.vue2.js +35 -32
- package/components/organisms/JDynamicForm.vue2.js.map +1 -1
- package/components/organisms/JDynamicTabs.vue.cjs +1 -1
- package/components/organisms/JDynamicTabs.vue.cjs.map +1 -1
- package/components/organisms/JDynamicTabs.vue.js +47 -52
- package/components/organisms/JDynamicTabs.vue.js.map +1 -1
- package/components/organisms/JFilterBar.vue.cjs +6 -1
- package/components/organisms/JFilterBar.vue.cjs.map +1 -1
- package/components/organisms/JFilterBar.vue.js +10 -137
- package/components/organisms/JFilterBar.vue.js.map +1 -1
- package/components/organisms/JFilterBar.vue2.cjs +1 -1
- package/components/organisms/JFilterBar.vue2.cjs.map +1 -1
- package/components/organisms/JFilterBar.vue2.js +141 -2
- package/components/organisms/JFilterBar.vue2.js.map +1 -1
- package/components/organisms/JFormModal.vue.cjs +1 -1
- package/components/organisms/JFormModal.vue.cjs.map +1 -1
- package/components/organisms/JFormModal.vue.js +54 -49
- package/components/organisms/JFormModal.vue.js.map +1 -1
- package/components/organisms/JHeader.vue.cjs +1 -1
- package/components/organisms/JHeader.vue.cjs.map +1 -1
- package/components/organisms/JHeader.vue.js +211 -208
- package/components/organisms/JHeader.vue.js.map +1 -1
- package/components/organisms/JModal.vue.cjs +1 -1
- package/components/organisms/JModal.vue.cjs.map +1 -1
- package/components/organisms/JModal.vue.js +31 -26
- package/components/organisms/JModal.vue.js.map +1 -1
- package/components/organisms/JPageContainer.vue.cjs +1 -1
- package/components/organisms/JPageContainer.vue.cjs.map +1 -1
- package/components/organisms/JPageContainer.vue.js +22 -22
- package/components/organisms/JPageContainer.vue.js.map +1 -1
- package/components/organisms/JSearchPanel.vue2.cjs +1 -1
- package/components/organisms/JSearchPanel.vue2.cjs.map +1 -1
- package/components/organisms/JSearchPanel.vue2.js +34 -32
- package/components/organisms/JSearchPanel.vue2.js.map +1 -1
- package/components/organisms/JShuttle.vue.cjs +7 -0
- package/components/organisms/JShuttle.vue.cjs.map +1 -0
- package/components/organisms/JShuttle.vue.js +13 -0
- package/components/organisms/JShuttle.vue.js.map +1 -0
- package/components/organisms/JShuttle.vue2.cjs +2 -0
- package/components/organisms/JShuttle.vue2.cjs.map +1 -0
- package/components/organisms/JShuttle.vue2.js +216 -0
- package/components/organisms/JShuttle.vue2.js.map +1 -0
- package/components/organisms/JSidebarAdvanced.vue.cjs +1 -1
- package/components/organisms/JSidebarAdvanced.vue.js +7 -7
- package/components/organisms/JSidebarAdvanced.vue2.cjs +1 -1
- package/components/organisms/JSidebarAdvanced.vue2.cjs.map +1 -1
- package/components/organisms/JSidebarAdvanced.vue2.js +40 -40
- package/components/organisms/JSidebarAdvanced.vue2.js.map +1 -1
- package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue.cjs +1 -1
- package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue.cjs.map +1 -1
- package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue.js +83 -63
- package/components/organisms/JSidebarSimple/JDynamicMenuItem.vue.js.map +1 -1
- package/components/organisms/JSidebarSimple.vue.cjs +1 -1
- package/components/organisms/JSidebarSimple.vue.js +2 -2
- package/components/organisms/JSidebarSimple.vue2.cjs +1 -1
- package/components/organisms/JSidebarSimple.vue2.cjs.map +1 -1
- package/components/organisms/JSidebarSimple.vue2.js +2 -2
- package/components/organisms/JSidebarSimple.vue2.js.map +1 -1
- package/components/shadcn/AccordionTrigger.vue.cjs +1 -1
- package/components/shadcn/AccordionTrigger.vue.cjs.map +1 -1
- package/components/shadcn/AccordionTrigger.vue.js +3 -3
- package/components/shadcn/AccordionTrigger.vue.js.map +1 -1
- package/components/shadcn/Card.vue.cjs +1 -1
- package/components/shadcn/Card.vue.cjs.map +1 -1
- package/components/shadcn/Card.vue.js +1 -1
- package/components/shadcn/Card.vue.js.map +1 -1
- package/components/shadcn/CardContent.vue.cjs +1 -1
- package/components/shadcn/CardContent.vue.cjs.map +1 -1
- package/components/shadcn/CardContent.vue.js +4 -4
- package/components/shadcn/CardContent.vue.js.map +1 -1
- package/components/shadcn/CardDescription.vue.cjs +1 -1
- package/components/shadcn/CardDescription.vue.cjs.map +1 -1
- package/components/shadcn/CardDescription.vue.js +1 -1
- package/components/shadcn/CardDescription.vue.js.map +1 -1
- package/components/shadcn/CardFooter.vue.cjs +1 -1
- package/components/shadcn/CardFooter.vue.cjs.map +1 -1
- package/components/shadcn/CardFooter.vue.js +7 -7
- package/components/shadcn/CardFooter.vue.js.map +1 -1
- package/components/shadcn/CardHeader.vue.cjs +1 -1
- package/components/shadcn/CardHeader.vue.cjs.map +1 -1
- package/components/shadcn/CardHeader.vue.js +8 -8
- package/components/shadcn/CardHeader.vue.js.map +1 -1
- package/components/shadcn/CardTitle.vue.cjs +1 -1
- package/components/shadcn/CardTitle.vue.cjs.map +1 -1
- package/components/shadcn/CardTitle.vue.js +5 -5
- package/components/shadcn/CardTitle.vue.js.map +1 -1
- package/components/shadcn/Input.vue.cjs +1 -1
- package/components/shadcn/Input.vue.cjs.map +1 -1
- package/components/shadcn/Input.vue.js +3 -3
- package/components/shadcn/Input.vue.js.map +1 -1
- package/components/shadcn/SelectTrigger.vue.cjs +1 -1
- package/components/shadcn/SelectTrigger.vue.cjs.map +1 -1
- package/components/shadcn/SelectTrigger.vue.js +2 -2
- package/components/shadcn/SelectTrigger.vue.js.map +1 -1
- package/components/shadcn/Switch.vue.cjs +1 -1
- package/components/shadcn/Switch.vue.cjs.map +1 -1
- package/components/shadcn/Switch.vue.js +2 -2
- package/components/shadcn/Switch.vue.js.map +1 -1
- package/components/shadcn/TabsContent.vue.cjs +1 -1
- package/components/shadcn/TabsContent.vue.cjs.map +1 -1
- package/components/shadcn/TabsContent.vue.js +1 -1
- package/components/shadcn/TabsContent.vue.js.map +1 -1
- package/components/shadcn/TabsList.vue.cjs +1 -1
- package/components/shadcn/TabsList.vue.cjs.map +1 -1
- package/components/shadcn/TabsList.vue.js +10 -10
- package/components/shadcn/TabsList.vue.js.map +1 -1
- package/components/shadcn/TabsTrigger.vue.cjs +1 -1
- package/components/shadcn/TabsTrigger.vue.cjs.map +1 -1
- package/components/shadcn/TabsTrigger.vue.js +4 -4
- package/components/shadcn/TabsTrigger.vue.js.map +1 -1
- package/components/shadcn/Textarea.vue.cjs +1 -1
- package/components/shadcn/Textarea.vue.cjs.map +1 -1
- package/components/shadcn/Textarea.vue.js +2 -2
- package/components/shadcn/Textarea.vue.js.map +1 -1
- package/components/shadcn/index.cjs +1 -1
- package/components/shadcn/index.cjs.map +1 -1
- package/components/shadcn/index.js +9 -8
- package/components/shadcn/index.js.map +1 -1
- package/components/templates/JLayout.vue.cjs.map +1 -1
- package/components/templates/JLayout.vue.js.map +1 -1
- package/index.cjs +1 -1
- package/index.js +73 -67
- package/package.json +1 -1
- package/types/index.d.ts +1025 -766
- package/assets/jwms-portal-frontend-DntSIcYt.css +0 -1
- package/components/molecules/JFormField.vue3.cjs +0 -2
- package/components/molecules/JFormField.vue3.cjs.map +0 -1
- package/components/molecules/JFormField.vue3.js +0 -6
- package/components/molecules/JFormField.vue3.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JProgress.vue.cjs","sources":["../../../../src/components/atoms/JProgress.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport Progress from '@/components/shadcn/Progress.vue'\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'primary' // 강조 스타일 (파랑)\r\n | 'success' // 성공 스타일 (초록)\r\n | 'warning' // 경고 스타일 (주황)\r\n | 'danger' // 위험 스타일 (빨강)\r\n\r\ntype SizeType = 'sm' | 'md' | 'lg'\r\n\r\ntype VariantType = 'linear' | 'circular'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n value?: number\r\n max?: number\r\n class?: string\r\n /** 스타일 프리셋 */\r\n styletype?: StyleType\r\n /** 크기 프리셋 */\r\n size?: SizeType\r\n /** 라벨 텍스트 */\r\n label?: string\r\n /** 진행률 퍼센트 표시 여부 */\r\n showLabel?: boolean\r\n /** 설명 텍스트 */\r\n description?: string\r\n /** 프로그레스 바 모양 */\r\n variant?: VariantType\r\n /** 무한 로딩 애니메이션 여부 */\r\n indeterminate?: boolean\r\n }>(),\r\n {\r\n value: 0,\r\n max: 100,\r\n styletype: 'default',\r\n size: 'md',\r\n label: '',\r\n showLabel: true,\r\n description: '',\r\n variant: 'linear',\r\n indeterminate: false,\r\n },\r\n)\r\n\r\n/**\r\n * styletype -> class 매핑\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, { class: string }> = {\r\n default: { class: '' },\r\n primary: { \r\n class: '[&>div]:bg-blue-500',\r\n },\r\n success: { \r\n class: '[&>div]:bg-green-500',\r\n },\r\n warning: { \r\n class: '[&>div]:bg-amber-500',\r\n },\r\n danger: { \r\n class: '[&>div]:bg-red-500',\r\n },\r\n}\r\n\r\n/**\r\n * size -> class 매핑\r\n */\r\nconst SIZE_PRESETS: Record<SizeType, { class: string }> = {\r\n sm: { \r\n class: 'h-2',\r\n },\r\n md: { \r\n class: 'h-4',\r\n },\r\n lg: { \r\n class: 'h-6',\r\n },\r\n}\r\n\r\n/**\r\n * variant -> size 매핑 (circular용)\r\n */\r\nconst CIRCULAR_SIZE_PRESETS: Record<SizeType, { size: number }> = {\r\n sm: { \r\n size: 60,\r\n },\r\n md: { \r\n size: 80,\r\n },\r\n lg: { \r\n size: 100,\r\n },\r\n}\r\n\r\n/** 진행률 퍼센트 계산 */\r\nconst percentage = computed(() => {\r\n return Math.round((props.value! / props.max!) * 100)\r\n})\r\n\r\n/** 최종 바인딩: 직접 넘긴 class가 있으면 styletype과 size 기본값과 병합 */\r\nconst mapped = computed(() => {\r\n const stylePreset = STYLE_PRESETS[props.styletype!]\r\n const sizePreset = SIZE_PRESETS[props.size!]\r\n const finalClass = [stylePreset.class, sizePreset.class, props.class].filter(Boolean).join(' ')\r\n \r\n return {\r\n modelValue: props.value,\r\n max: props.max,\r\n class: finalClass,\r\n }\r\n})\r\n\r\n/** 원형 프로그레스 바 스타일 계산 */\r\nconst circularStyle = computed(() => {\r\n const sizePreset = CIRCULAR_SIZE_PRESETS[props.size!]\r\n \r\n // 색상 추출 - linear와 동일한 색상 사용\r\n let color = '#000000' // default: 검은색 (linear의 기본 색상과 동일)\r\n if (props.styletype === 'primary') color = '#3b82f6' // blue-500\r\n else if (props.styletype === 'success') color = '#10b981' // green-500\r\n else if (props.styletype === 'warning') color = '#f59e0b' // amber-500\r\n else if (props.styletype === 'danger') color = '#ef4444' // red-500\r\n \r\n return {\r\n size: sizePreset.size,\r\n color,\r\n }\r\n})\r\n\r\n/** indeterminate 상태에서 표시할 텍스트 */\r\nconst indeterminateText = computed(() => {\r\n return props.indeterminate ? '로딩 중...' : `${percentage.value}%`\r\n})\r\n\r\n/** Linear indeterminate 색상 계산 */\r\nconst linearIndeterminateColor = computed(() => {\r\n let color = '#000000' // default: 검은색\r\n if (props.styletype === 'primary') color = '#3b82f6' // blue-500\r\n else if (props.styletype === 'success') color = '#10b981' // green-500\r\n else if (props.styletype === 'warning') color = '#f59e0b' // amber-500\r\n else if (props.styletype === 'danger') color = '#ef4444' // red-500\r\n \r\n return color\r\n})\r\n</script>\r\n\r\n<template>\r\n <div class=\"space-y-2\">\r\n <!-- Linear Progress용 상단 라벨 -->\r\n <div v-if=\"props.variant === 'linear' && (props.label || props.showLabel || props.indeterminate)\" class=\"flex justify-between items-center\">\r\n <p v-if=\"props.label\" class=\"text-sm font-medium text-gray-700\">\r\n {{ props.label }}\r\n </p>\r\n <p v-if=\"props.showLabel || props.indeterminate\" class=\"text-sm font-medium text-gray-600\">\r\n {{ indeterminateText }}\r\n </p>\r\n </div>\r\n \r\n <!-- Circular Progress용 상단 라벨 -->\r\n <div v-if=\"props.variant === 'circular' && props.label\" class=\"text-center mb-2\">\r\n <p class=\"text-sm font-medium text-gray-700\">{{ props.label }}</p>\r\n </div>\r\n \r\n <!-- Linear Progress -->\r\n <div v-if=\"props.variant === 'linear'\">\r\n <!-- Indeterminate Linear -->\r\n <div v-if=\"props.indeterminate\" class=\"relative overflow-hidden rounded-full bg-gray-200\" :class=\"SIZE_PRESETS[props.size!].class\">\r\n <div \r\n class=\"absolute h-full w-full animate-pulse\"\r\n :style=\"{ backgroundColor: linearIndeterminateColor }\"\r\n />\r\n <div \r\n class=\"absolute h-full w-1/3 animate-[indeterminate-linear_2s_infinite]\"\r\n :style=\"{ backgroundColor: linearIndeterminateColor }\"\r\n />\r\n </div>\r\n <!-- Determinate Linear -->\r\n <Progress v-else v-bind=\"mapped\" />\r\n </div>\r\n \r\n <!-- Circular Progress -->\r\n <div v-else-if=\"props.variant === 'circular'\" class=\"flex justify-center\">\r\n <div class=\"relative\" :style=\"{ width: circularStyle.size + 'px', height: circularStyle.size + 'px' }\">\r\n <!-- Indeterminate Circular -->\r\n <div v-if=\"props.indeterminate\">\r\n <svg class=\"w-full h-full animate-spin\" viewBox=\"0 0 100 100\">\r\n <circle\r\n cx=\"50\"\r\n cy=\"50\"\r\n r=\"45\"\r\n stroke=\"#e5e7eb\"\r\n stroke-width=\"8\"\r\n fill=\"none\"\r\n />\r\n <circle\r\n cx=\"50\"\r\n cy=\"50\"\r\n r=\"45\"\r\n :stroke=\"circularStyle.color\"\r\n stroke-width=\"8\"\r\n fill=\"none\"\r\n stroke-linecap=\"round\"\r\n stroke-dasharray=\"70 213\"\r\n stroke-dashoffset=\"0\"\r\n class=\"animate-[indeterminate-circular_2s_ease-in-out_infinite]\"\r\n />\r\n </svg>\r\n </div>\r\n <!-- Determinate Circular -->\r\n <div v-else>\r\n <svg class=\"w-full h-full transform -rotate-90\" viewBox=\"0 0 100 100\">\r\n <!-- Background circle -->\r\n <circle\r\n cx=\"50\"\r\n cy=\"50\"\r\n r=\"45\"\r\n stroke=\"#e5e7eb\"\r\n stroke-width=\"8\"\r\n fill=\"none\"\r\n />\r\n <!-- Progress circle -->\r\n <circle\r\n cx=\"50\"\r\n cy=\"50\"\r\n r=\"45\"\r\n :stroke=\"circularStyle.color\"\r\n stroke-width=\"8\"\r\n fill=\"none\"\r\n stroke-linecap=\"round\"\r\n :stroke-dasharray=\"283\"\r\n :stroke-dashoffset=\"283 - (283 * percentage / 100)\"\r\n class=\"transition-all duration-300 ease-in-out\"\r\n />\r\n </svg>\r\n </div>\r\n <!-- Center text -->\r\n <div v-if=\"props.showLabel || props.indeterminate\" class=\"absolute inset-0 flex items-center justify-center\">\r\n <span class=\"text-sm font-medium text-gray-700\">{{ indeterminateText }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Circular Progress용 하단 description -->\r\n <div v-if=\"props.variant === 'circular' && props.description\" class=\"text-center mt-2\">\r\n <p class=\"text-xs text-gray-500\">{{ props.description }}</p>\r\n </div>\r\n \r\n <!-- Linear Progress용 하단 description -->\r\n <p v-if=\"props.variant === 'linear' && props.description\" class=\"text-xs text-gray-500\">\r\n {{ props.description }}\r\n </p>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n@keyframes indeterminate-linear {\r\n 0% {\r\n transform: translateX(-100%);\r\n }\r\n 100% {\r\n transform: translateX(400%);\r\n }\r\n}\r\n\r\n@keyframes indeterminate-circular {\r\n 0% {\r\n stroke-dasharray: 70 213;\r\n stroke-dashoffset: 0;\r\n }\r\n 50% {\r\n stroke-dasharray: 140 143;\r\n stroke-dashoffset: -70;\r\n }\r\n 100% {\r\n stroke-dasharray: 70 213;\r\n stroke-dashoffset: -213;\r\n }\r\n}\r\n</style>\r\n"],"names":["props","__props","STYLE_PRESETS","SIZE_PRESETS","CIRCULAR_SIZE_PRESETS","percentage","computed","mapped","stylePreset","sizePreset","finalClass","circularStyle","color","indeterminateText","linearIndeterminateColor","_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_4","_hoisted_5","_createElementVNode","_hoisted_6","_hoisted_7","_normalizeClass","_createBlock","Progress","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_12","_hoisted_13","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"JProgress.vue.cjs","sources":["../../../../src/components/atoms/JProgress.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport Progress from '@/components/shadcn/Progress.vue'\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'primary' // 강조 스타일 (파랑)\r\n | 'success' // 성공 스타일 (초록)\r\n | 'warning' // 경고 스타일 (주황)\r\n | 'danger' // 위험 스타일 (빨강)\r\n\r\ntype SizeType = 'xs' | 'sm' | 'md' | 'lg'\n\r\ntype VariantType = 'linear' | 'circular'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n value?: number\r\n max?: number\r\n class?: string\r\n /** 스타일 프리셋 */\r\n styletype?: StyleType\r\n /** 크기 프리셋 */\r\n size?: SizeType\r\n /** 라벨 텍스트 */\r\n label?: string\r\n /** 진행률 퍼센트 표시 여부 */\r\n showLabel?: boolean\r\n /** 설명 텍스트 */\r\n description?: string\r\n /** 프로그레스 바 모양 */\r\n variant?: VariantType\r\n /** 무한 로딩 애니메이션 여부 */\r\n indeterminate?: boolean\r\n }>(),\r\n {\n value: 0,\n max: 100,\n styletype: 'default',\n size: 'sm',\n label: '',\n showLabel: true,\n description: '',\n variant: 'linear',\n indeterminate: false,\n },\r\n)\r\n\r\n/**\r\n * styletype -> class 매핑\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, { class: string }> = {\r\n default: { class: '' },\r\n primary: { \r\n class: '[&>div]:bg-blue-500',\r\n },\r\n success: { \r\n class: '[&>div]:bg-green-500',\r\n },\r\n warning: { \r\n class: '[&>div]:bg-amber-500',\r\n },\r\n danger: { \r\n class: '[&>div]:bg-red-500',\r\n },\r\n}\r\n\r\n/**\r\n * size -> class 매핑\r\n */\r\nconst SIZE_PRESETS: Record<SizeType, { class: string }> = {\n xs: { \n class: 'h-1',\n },\n sm: { \n class: 'h-2',\n },\n md: { \n class: 'h-3',\n },\n lg: { \n class: 'h-4',\n },\n}\n\r\n/**\r\n * variant -> size 매핑 (circular용)\r\n */\r\nconst CIRCULAR_SIZE_PRESETS: Record<SizeType, { size: number }> = {\n xs: { \n size: 48,\n },\n sm: { \n size: 60,\n },\n md: { \n size: 72,\n },\n lg: { \n size: 88,\n },\n}\r\n\r\n/** 진행률 퍼센트 계산 */\r\nconst percentage = computed(() => {\r\n return Math.round((props.value! / props.max!) * 100)\r\n})\r\n\r\n/** 최종 바인딩: 직접 넘긴 class가 있으면 styletype과 size 기본값과 병합 */\r\nconst mapped = computed(() => {\r\n const stylePreset = STYLE_PRESETS[props.styletype!]\r\n const sizePreset = SIZE_PRESETS[props.size!]\r\n const finalClass = [stylePreset.class, sizePreset.class, props.class].filter(Boolean).join(' ')\r\n \r\n return {\r\n modelValue: props.value,\r\n max: props.max,\r\n class: finalClass,\r\n }\r\n})\r\n\r\n/** 원형 프로그레스 바 스타일 계산 */\r\nconst circularStyle = computed(() => {\r\n const sizePreset = CIRCULAR_SIZE_PRESETS[props.size!]\r\n \r\n // 색상 추출 - linear와 동일한 색상 사용\r\n let color = '#000000' // default: 검은색 (linear의 기본 색상과 동일)\r\n if (props.styletype === 'primary') color = '#3b82f6' // blue-500\r\n else if (props.styletype === 'success') color = '#10b981' // green-500\r\n else if (props.styletype === 'warning') color = '#f59e0b' // amber-500\r\n else if (props.styletype === 'danger') color = '#ef4444' // red-500\r\n \r\n return {\r\n size: sizePreset.size,\r\n color,\r\n }\r\n})\r\n\r\n/** indeterminate 상태에서 표시할 텍스트 */\r\nconst indeterminateText = computed(() => {\r\n return props.indeterminate ? '로딩 중...' : `${percentage.value}%`\r\n})\r\n\r\n/** Linear indeterminate 색상 계산 */\r\nconst linearIndeterminateColor = computed(() => {\r\n let color = '#000000' // default: 검은색\r\n if (props.styletype === 'primary') color = '#3b82f6' // blue-500\r\n else if (props.styletype === 'success') color = '#10b981' // green-500\r\n else if (props.styletype === 'warning') color = '#f59e0b' // amber-500\r\n else if (props.styletype === 'danger') color = '#ef4444' // red-500\r\n \r\n return color\r\n})\r\n</script>\r\n\r\n<template>\r\n <div class=\"space-y-2\">\r\n <!-- Linear Progress용 상단 라벨 -->\r\n <div v-if=\"props.variant === 'linear' && (props.label || props.showLabel || props.indeterminate)\" class=\"flex justify-between items-center\">\r\n <p v-if=\"props.label\" class=\"text-sm font-medium text-gray-700\">\r\n {{ props.label }}\r\n </p>\r\n <p v-if=\"props.showLabel || props.indeterminate\" class=\"text-sm font-medium text-gray-600\">\r\n {{ indeterminateText }}\r\n </p>\r\n </div>\r\n \r\n <!-- Circular Progress용 상단 라벨 -->\r\n <div v-if=\"props.variant === 'circular' && props.label\" class=\"text-center mb-2\">\r\n <p class=\"text-sm font-medium text-gray-700\">{{ props.label }}</p>\r\n </div>\r\n \r\n <!-- Linear Progress -->\r\n <div v-if=\"props.variant === 'linear'\">\r\n <!-- Indeterminate Linear -->\r\n <div v-if=\"props.indeterminate\" class=\"relative overflow-hidden rounded-full bg-gray-200\" :class=\"SIZE_PRESETS[props.size!].class\">\r\n <div \r\n class=\"absolute h-full w-full animate-pulse\"\r\n :style=\"{ backgroundColor: linearIndeterminateColor }\"\r\n />\r\n <div \r\n class=\"absolute h-full w-1/3 animate-[indeterminate-linear_2s_infinite]\"\r\n :style=\"{ backgroundColor: linearIndeterminateColor }\"\r\n />\r\n </div>\r\n <!-- Determinate Linear -->\r\n <Progress v-else v-bind=\"mapped\" />\r\n </div>\r\n \r\n <!-- Circular Progress -->\r\n <div v-else-if=\"props.variant === 'circular'\" class=\"flex justify-center\">\r\n <div class=\"relative\" :style=\"{ width: circularStyle.size + 'px', height: circularStyle.size + 'px' }\">\r\n <!-- Indeterminate Circular -->\r\n <div v-if=\"props.indeterminate\">\r\n <svg class=\"w-full h-full animate-spin\" viewBox=\"0 0 100 100\">\r\n <circle\r\n cx=\"50\"\r\n cy=\"50\"\r\n r=\"45\"\r\n stroke=\"#e5e7eb\"\r\n stroke-width=\"8\"\r\n fill=\"none\"\r\n />\r\n <circle\r\n cx=\"50\"\r\n cy=\"50\"\r\n r=\"45\"\r\n :stroke=\"circularStyle.color\"\r\n stroke-width=\"8\"\r\n fill=\"none\"\r\n stroke-linecap=\"round\"\r\n stroke-dasharray=\"70 213\"\r\n stroke-dashoffset=\"0\"\r\n class=\"animate-[indeterminate-circular_2s_ease-in-out_infinite]\"\r\n />\r\n </svg>\r\n </div>\r\n <!-- Determinate Circular -->\r\n <div v-else>\r\n <svg class=\"w-full h-full transform -rotate-90\" viewBox=\"0 0 100 100\">\r\n <!-- Background circle -->\r\n <circle\r\n cx=\"50\"\r\n cy=\"50\"\r\n r=\"45\"\r\n stroke=\"#e5e7eb\"\r\n stroke-width=\"8\"\r\n fill=\"none\"\r\n />\r\n <!-- Progress circle -->\r\n <circle\r\n cx=\"50\"\r\n cy=\"50\"\r\n r=\"45\"\r\n :stroke=\"circularStyle.color\"\r\n stroke-width=\"8\"\r\n fill=\"none\"\r\n stroke-linecap=\"round\"\r\n :stroke-dasharray=\"283\"\r\n :stroke-dashoffset=\"283 - (283 * percentage / 100)\"\r\n class=\"transition-all duration-300 ease-in-out\"\r\n />\r\n </svg>\r\n </div>\r\n <!-- Center text -->\r\n <div v-if=\"props.showLabel || props.indeterminate\" class=\"absolute inset-0 flex items-center justify-center\">\r\n <span class=\"text-sm font-medium text-gray-700\">{{ indeterminateText }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Circular Progress용 하단 description -->\r\n <div v-if=\"props.variant === 'circular' && props.description\" class=\"text-center mt-2\">\r\n <p class=\"text-xs text-gray-500\">{{ props.description }}</p>\r\n </div>\r\n \r\n <!-- Linear Progress용 하단 description -->\r\n <p v-if=\"props.variant === 'linear' && props.description\" class=\"text-xs text-gray-500\">\r\n {{ props.description }}\r\n </p>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n@keyframes indeterminate-linear {\r\n 0% {\r\n transform: translateX(-100%);\r\n }\r\n 100% {\r\n transform: translateX(400%);\r\n }\r\n}\r\n\r\n@keyframes indeterminate-circular {\r\n 0% {\r\n stroke-dasharray: 70 213;\r\n stroke-dashoffset: 0;\r\n }\r\n 50% {\r\n stroke-dasharray: 140 143;\r\n stroke-dashoffset: -70;\r\n }\r\n 100% {\r\n stroke-dasharray: 70 213;\r\n stroke-dashoffset: -213;\r\n }\r\n}\r\n</style>\r\n"],"names":["props","__props","STYLE_PRESETS","SIZE_PRESETS","CIRCULAR_SIZE_PRESETS","percentage","computed","mapped","stylePreset","sizePreset","finalClass","circularStyle","color","indeterminateText","linearIndeterminateColor","_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_4","_hoisted_5","_createElementVNode","_hoisted_6","_hoisted_7","_normalizeClass","_createBlock","Progress","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_12","_hoisted_13","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineComponent as
|
|
1
|
+
import { defineComponent as k, computed as o, createElementBlock as s, openBlock as t, createCommentVNode as r, toDisplayString as n, createElementVNode as i, createBlock as b, normalizeClass as g, normalizeStyle as d, normalizeProps as w, mergeProps as z } from "vue";
|
|
2
2
|
import S from "../shadcn/Progress.vue.js";
|
|
3
3
|
const E = { class: "space-y-2" }, C = {
|
|
4
4
|
key: 0,
|
|
@@ -30,14 +30,14 @@ const E = { class: "space-y-2" }, C = {
|
|
|
30
30
|
}, U = { class: "text-xs text-gray-500" }, Y = {
|
|
31
31
|
key: 5,
|
|
32
32
|
class: "text-xs text-gray-500"
|
|
33
|
-
}, G = /* @__PURE__ */
|
|
33
|
+
}, G = /* @__PURE__ */ k({
|
|
34
34
|
__name: "JProgress",
|
|
35
35
|
props: {
|
|
36
36
|
value: { default: 0 },
|
|
37
37
|
max: { default: 100 },
|
|
38
38
|
class: {},
|
|
39
39
|
styletype: { default: "default" },
|
|
40
|
-
size: { default: "
|
|
40
|
+
size: { default: "sm" },
|
|
41
41
|
label: { default: "" },
|
|
42
42
|
showLabel: { type: Boolean, default: !0 },
|
|
43
43
|
description: { default: "" },
|
|
@@ -60,31 +60,37 @@ const E = { class: "space-y-2" }, C = {
|
|
|
60
60
|
class: "[&>div]:bg-red-500"
|
|
61
61
|
}
|
|
62
62
|
}, u = {
|
|
63
|
+
xs: {
|
|
64
|
+
class: "h-1"
|
|
65
|
+
},
|
|
63
66
|
sm: {
|
|
64
67
|
class: "h-2"
|
|
65
68
|
},
|
|
66
69
|
md: {
|
|
67
|
-
class: "h-
|
|
70
|
+
class: "h-3"
|
|
68
71
|
},
|
|
69
72
|
lg: {
|
|
70
|
-
class: "h-
|
|
73
|
+
class: "h-4"
|
|
71
74
|
}
|
|
72
75
|
}, v = {
|
|
76
|
+
xs: {
|
|
77
|
+
size: 48
|
|
78
|
+
},
|
|
73
79
|
sm: {
|
|
74
80
|
size: 60
|
|
75
81
|
},
|
|
76
82
|
md: {
|
|
77
|
-
size:
|
|
83
|
+
size: 72
|
|
78
84
|
},
|
|
79
85
|
lg: {
|
|
80
|
-
size:
|
|
86
|
+
size: 88
|
|
81
87
|
}
|
|
82
88
|
}, f = o(() => Math.round(e.value / e.max * 100)), h = o(() => {
|
|
83
|
-
const a = p[e.styletype], l = u[e.size],
|
|
89
|
+
const a = p[e.styletype], l = u[e.size], x = [a.class, l.class, e.class].filter(Boolean).join(" ");
|
|
84
90
|
return {
|
|
85
91
|
modelValue: e.value,
|
|
86
92
|
max: e.max,
|
|
87
|
-
class:
|
|
93
|
+
class: x
|
|
88
94
|
};
|
|
89
95
|
}), c = o(() => {
|
|
90
96
|
const a = v[e.size];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JProgress.vue.js","sources":["../../../../src/components/atoms/JProgress.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport Progress from '@/components/shadcn/Progress.vue'\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'primary' // 강조 스타일 (파랑)\r\n | 'success' // 성공 스타일 (초록)\r\n | 'warning' // 경고 스타일 (주황)\r\n | 'danger' // 위험 스타일 (빨강)\r\n\r\ntype SizeType = 'sm' | 'md' | 'lg'\r\n\r\ntype VariantType = 'linear' | 'circular'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n value?: number\r\n max?: number\r\n class?: string\r\n /** 스타일 프리셋 */\r\n styletype?: StyleType\r\n /** 크기 프리셋 */\r\n size?: SizeType\r\n /** 라벨 텍스트 */\r\n label?: string\r\n /** 진행률 퍼센트 표시 여부 */\r\n showLabel?: boolean\r\n /** 설명 텍스트 */\r\n description?: string\r\n /** 프로그레스 바 모양 */\r\n variant?: VariantType\r\n /** 무한 로딩 애니메이션 여부 */\r\n indeterminate?: boolean\r\n }>(),\r\n {\r\n value: 0,\r\n max: 100,\r\n styletype: 'default',\r\n size: 'md',\r\n label: '',\r\n showLabel: true,\r\n description: '',\r\n variant: 'linear',\r\n indeterminate: false,\r\n },\r\n)\r\n\r\n/**\r\n * styletype -> class 매핑\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, { class: string }> = {\r\n default: { class: '' },\r\n primary: { \r\n class: '[&>div]:bg-blue-500',\r\n },\r\n success: { \r\n class: '[&>div]:bg-green-500',\r\n },\r\n warning: { \r\n class: '[&>div]:bg-amber-500',\r\n },\r\n danger: { \r\n class: '[&>div]:bg-red-500',\r\n },\r\n}\r\n\r\n/**\r\n * size -> class 매핑\r\n */\r\nconst SIZE_PRESETS: Record<SizeType, { class: string }> = {\r\n sm: { \r\n class: 'h-2',\r\n },\r\n md: { \r\n class: 'h-4',\r\n },\r\n lg: { \r\n class: 'h-6',\r\n },\r\n}\r\n\r\n/**\r\n * variant -> size 매핑 (circular용)\r\n */\r\nconst CIRCULAR_SIZE_PRESETS: Record<SizeType, { size: number }> = {\r\n sm: { \r\n size: 60,\r\n },\r\n md: { \r\n size: 80,\r\n },\r\n lg: { \r\n size: 100,\r\n },\r\n}\r\n\r\n/** 진행률 퍼센트 계산 */\r\nconst percentage = computed(() => {\r\n return Math.round((props.value! / props.max!) * 100)\r\n})\r\n\r\n/** 최종 바인딩: 직접 넘긴 class가 있으면 styletype과 size 기본값과 병합 */\r\nconst mapped = computed(() => {\r\n const stylePreset = STYLE_PRESETS[props.styletype!]\r\n const sizePreset = SIZE_PRESETS[props.size!]\r\n const finalClass = [stylePreset.class, sizePreset.class, props.class].filter(Boolean).join(' ')\r\n \r\n return {\r\n modelValue: props.value,\r\n max: props.max,\r\n class: finalClass,\r\n }\r\n})\r\n\r\n/** 원형 프로그레스 바 스타일 계산 */\r\nconst circularStyle = computed(() => {\r\n const sizePreset = CIRCULAR_SIZE_PRESETS[props.size!]\r\n \r\n // 색상 추출 - linear와 동일한 색상 사용\r\n let color = '#000000' // default: 검은색 (linear의 기본 색상과 동일)\r\n if (props.styletype === 'primary') color = '#3b82f6' // blue-500\r\n else if (props.styletype === 'success') color = '#10b981' // green-500\r\n else if (props.styletype === 'warning') color = '#f59e0b' // amber-500\r\n else if (props.styletype === 'danger') color = '#ef4444' // red-500\r\n \r\n return {\r\n size: sizePreset.size,\r\n color,\r\n }\r\n})\r\n\r\n/** indeterminate 상태에서 표시할 텍스트 */\r\nconst indeterminateText = computed(() => {\r\n return props.indeterminate ? '로딩 중...' : `${percentage.value}%`\r\n})\r\n\r\n/** Linear indeterminate 색상 계산 */\r\nconst linearIndeterminateColor = computed(() => {\r\n let color = '#000000' // default: 검은색\r\n if (props.styletype === 'primary') color = '#3b82f6' // blue-500\r\n else if (props.styletype === 'success') color = '#10b981' // green-500\r\n else if (props.styletype === 'warning') color = '#f59e0b' // amber-500\r\n else if (props.styletype === 'danger') color = '#ef4444' // red-500\r\n \r\n return color\r\n})\r\n</script>\r\n\r\n<template>\r\n <div class=\"space-y-2\">\r\n <!-- Linear Progress용 상단 라벨 -->\r\n <div v-if=\"props.variant === 'linear' && (props.label || props.showLabel || props.indeterminate)\" class=\"flex justify-between items-center\">\r\n <p v-if=\"props.label\" class=\"text-sm font-medium text-gray-700\">\r\n {{ props.label }}\r\n </p>\r\n <p v-if=\"props.showLabel || props.indeterminate\" class=\"text-sm font-medium text-gray-600\">\r\n {{ indeterminateText }}\r\n </p>\r\n </div>\r\n \r\n <!-- Circular Progress용 상단 라벨 -->\r\n <div v-if=\"props.variant === 'circular' && props.label\" class=\"text-center mb-2\">\r\n <p class=\"text-sm font-medium text-gray-700\">{{ props.label }}</p>\r\n </div>\r\n \r\n <!-- Linear Progress -->\r\n <div v-if=\"props.variant === 'linear'\">\r\n <!-- Indeterminate Linear -->\r\n <div v-if=\"props.indeterminate\" class=\"relative overflow-hidden rounded-full bg-gray-200\" :class=\"SIZE_PRESETS[props.size!].class\">\r\n <div \r\n class=\"absolute h-full w-full animate-pulse\"\r\n :style=\"{ backgroundColor: linearIndeterminateColor }\"\r\n />\r\n <div \r\n class=\"absolute h-full w-1/3 animate-[indeterminate-linear_2s_infinite]\"\r\n :style=\"{ backgroundColor: linearIndeterminateColor }\"\r\n />\r\n </div>\r\n <!-- Determinate Linear -->\r\n <Progress v-else v-bind=\"mapped\" />\r\n </div>\r\n \r\n <!-- Circular Progress -->\r\n <div v-else-if=\"props.variant === 'circular'\" class=\"flex justify-center\">\r\n <div class=\"relative\" :style=\"{ width: circularStyle.size + 'px', height: circularStyle.size + 'px' }\">\r\n <!-- Indeterminate Circular -->\r\n <div v-if=\"props.indeterminate\">\r\n <svg class=\"w-full h-full animate-spin\" viewBox=\"0 0 100 100\">\r\n <circle\r\n cx=\"50\"\r\n cy=\"50\"\r\n r=\"45\"\r\n stroke=\"#e5e7eb\"\r\n stroke-width=\"8\"\r\n fill=\"none\"\r\n />\r\n <circle\r\n cx=\"50\"\r\n cy=\"50\"\r\n r=\"45\"\r\n :stroke=\"circularStyle.color\"\r\n stroke-width=\"8\"\r\n fill=\"none\"\r\n stroke-linecap=\"round\"\r\n stroke-dasharray=\"70 213\"\r\n stroke-dashoffset=\"0\"\r\n class=\"animate-[indeterminate-circular_2s_ease-in-out_infinite]\"\r\n />\r\n </svg>\r\n </div>\r\n <!-- Determinate Circular -->\r\n <div v-else>\r\n <svg class=\"w-full h-full transform -rotate-90\" viewBox=\"0 0 100 100\">\r\n <!-- Background circle -->\r\n <circle\r\n cx=\"50\"\r\n cy=\"50\"\r\n r=\"45\"\r\n stroke=\"#e5e7eb\"\r\n stroke-width=\"8\"\r\n fill=\"none\"\r\n />\r\n <!-- Progress circle -->\r\n <circle\r\n cx=\"50\"\r\n cy=\"50\"\r\n r=\"45\"\r\n :stroke=\"circularStyle.color\"\r\n stroke-width=\"8\"\r\n fill=\"none\"\r\n stroke-linecap=\"round\"\r\n :stroke-dasharray=\"283\"\r\n :stroke-dashoffset=\"283 - (283 * percentage / 100)\"\r\n class=\"transition-all duration-300 ease-in-out\"\r\n />\r\n </svg>\r\n </div>\r\n <!-- Center text -->\r\n <div v-if=\"props.showLabel || props.indeterminate\" class=\"absolute inset-0 flex items-center justify-center\">\r\n <span class=\"text-sm font-medium text-gray-700\">{{ indeterminateText }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Circular Progress용 하단 description -->\r\n <div v-if=\"props.variant === 'circular' && props.description\" class=\"text-center mt-2\">\r\n <p class=\"text-xs text-gray-500\">{{ props.description }}</p>\r\n </div>\r\n \r\n <!-- Linear Progress용 하단 description -->\r\n <p v-if=\"props.variant === 'linear' && props.description\" class=\"text-xs text-gray-500\">\r\n {{ props.description }}\r\n </p>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n@keyframes indeterminate-linear {\r\n 0% {\r\n transform: translateX(-100%);\r\n }\r\n 100% {\r\n transform: translateX(400%);\r\n }\r\n}\r\n\r\n@keyframes indeterminate-circular {\r\n 0% {\r\n stroke-dasharray: 70 213;\r\n stroke-dashoffset: 0;\r\n }\r\n 50% {\r\n stroke-dasharray: 140 143;\r\n stroke-dashoffset: -70;\r\n }\r\n 100% {\r\n stroke-dasharray: 70 213;\r\n stroke-dashoffset: -213;\r\n }\r\n}\r\n</style>\r\n"],"names":["props","__props","STYLE_PRESETS","SIZE_PRESETS","CIRCULAR_SIZE_PRESETS","percentage","computed","mapped","stylePreset","sizePreset","finalClass","circularStyle","color","indeterminateText","linearIndeterminateColor","_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_4","_hoisted_5","_createElementVNode","_hoisted_6","_hoisted_7","_normalizeClass","_createBlock","Progress","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_12","_hoisted_13","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"JProgress.vue.js","sources":["../../../../src/components/atoms/JProgress.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport Progress from '@/components/shadcn/Progress.vue'\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'primary' // 강조 스타일 (파랑)\r\n | 'success' // 성공 스타일 (초록)\r\n | 'warning' // 경고 스타일 (주황)\r\n | 'danger' // 위험 스타일 (빨강)\r\n\r\ntype SizeType = 'xs' | 'sm' | 'md' | 'lg'\n\r\ntype VariantType = 'linear' | 'circular'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n value?: number\r\n max?: number\r\n class?: string\r\n /** 스타일 프리셋 */\r\n styletype?: StyleType\r\n /** 크기 프리셋 */\r\n size?: SizeType\r\n /** 라벨 텍스트 */\r\n label?: string\r\n /** 진행률 퍼센트 표시 여부 */\r\n showLabel?: boolean\r\n /** 설명 텍스트 */\r\n description?: string\r\n /** 프로그레스 바 모양 */\r\n variant?: VariantType\r\n /** 무한 로딩 애니메이션 여부 */\r\n indeterminate?: boolean\r\n }>(),\r\n {\n value: 0,\n max: 100,\n styletype: 'default',\n size: 'sm',\n label: '',\n showLabel: true,\n description: '',\n variant: 'linear',\n indeterminate: false,\n },\r\n)\r\n\r\n/**\r\n * styletype -> class 매핑\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, { class: string }> = {\r\n default: { class: '' },\r\n primary: { \r\n class: '[&>div]:bg-blue-500',\r\n },\r\n success: { \r\n class: '[&>div]:bg-green-500',\r\n },\r\n warning: { \r\n class: '[&>div]:bg-amber-500',\r\n },\r\n danger: { \r\n class: '[&>div]:bg-red-500',\r\n },\r\n}\r\n\r\n/**\r\n * size -> class 매핑\r\n */\r\nconst SIZE_PRESETS: Record<SizeType, { class: string }> = {\n xs: { \n class: 'h-1',\n },\n sm: { \n class: 'h-2',\n },\n md: { \n class: 'h-3',\n },\n lg: { \n class: 'h-4',\n },\n}\n\r\n/**\r\n * variant -> size 매핑 (circular용)\r\n */\r\nconst CIRCULAR_SIZE_PRESETS: Record<SizeType, { size: number }> = {\n xs: { \n size: 48,\n },\n sm: { \n size: 60,\n },\n md: { \n size: 72,\n },\n lg: { \n size: 88,\n },\n}\r\n\r\n/** 진행률 퍼센트 계산 */\r\nconst percentage = computed(() => {\r\n return Math.round((props.value! / props.max!) * 100)\r\n})\r\n\r\n/** 최종 바인딩: 직접 넘긴 class가 있으면 styletype과 size 기본값과 병합 */\r\nconst mapped = computed(() => {\r\n const stylePreset = STYLE_PRESETS[props.styletype!]\r\n const sizePreset = SIZE_PRESETS[props.size!]\r\n const finalClass = [stylePreset.class, sizePreset.class, props.class].filter(Boolean).join(' ')\r\n \r\n return {\r\n modelValue: props.value,\r\n max: props.max,\r\n class: finalClass,\r\n }\r\n})\r\n\r\n/** 원형 프로그레스 바 스타일 계산 */\r\nconst circularStyle = computed(() => {\r\n const sizePreset = CIRCULAR_SIZE_PRESETS[props.size!]\r\n \r\n // 색상 추출 - linear와 동일한 색상 사용\r\n let color = '#000000' // default: 검은색 (linear의 기본 색상과 동일)\r\n if (props.styletype === 'primary') color = '#3b82f6' // blue-500\r\n else if (props.styletype === 'success') color = '#10b981' // green-500\r\n else if (props.styletype === 'warning') color = '#f59e0b' // amber-500\r\n else if (props.styletype === 'danger') color = '#ef4444' // red-500\r\n \r\n return {\r\n size: sizePreset.size,\r\n color,\r\n }\r\n})\r\n\r\n/** indeterminate 상태에서 표시할 텍스트 */\r\nconst indeterminateText = computed(() => {\r\n return props.indeterminate ? '로딩 중...' : `${percentage.value}%`\r\n})\r\n\r\n/** Linear indeterminate 색상 계산 */\r\nconst linearIndeterminateColor = computed(() => {\r\n let color = '#000000' // default: 검은색\r\n if (props.styletype === 'primary') color = '#3b82f6' // blue-500\r\n else if (props.styletype === 'success') color = '#10b981' // green-500\r\n else if (props.styletype === 'warning') color = '#f59e0b' // amber-500\r\n else if (props.styletype === 'danger') color = '#ef4444' // red-500\r\n \r\n return color\r\n})\r\n</script>\r\n\r\n<template>\r\n <div class=\"space-y-2\">\r\n <!-- Linear Progress용 상단 라벨 -->\r\n <div v-if=\"props.variant === 'linear' && (props.label || props.showLabel || props.indeterminate)\" class=\"flex justify-between items-center\">\r\n <p v-if=\"props.label\" class=\"text-sm font-medium text-gray-700\">\r\n {{ props.label }}\r\n </p>\r\n <p v-if=\"props.showLabel || props.indeterminate\" class=\"text-sm font-medium text-gray-600\">\r\n {{ indeterminateText }}\r\n </p>\r\n </div>\r\n \r\n <!-- Circular Progress용 상단 라벨 -->\r\n <div v-if=\"props.variant === 'circular' && props.label\" class=\"text-center mb-2\">\r\n <p class=\"text-sm font-medium text-gray-700\">{{ props.label }}</p>\r\n </div>\r\n \r\n <!-- Linear Progress -->\r\n <div v-if=\"props.variant === 'linear'\">\r\n <!-- Indeterminate Linear -->\r\n <div v-if=\"props.indeterminate\" class=\"relative overflow-hidden rounded-full bg-gray-200\" :class=\"SIZE_PRESETS[props.size!].class\">\r\n <div \r\n class=\"absolute h-full w-full animate-pulse\"\r\n :style=\"{ backgroundColor: linearIndeterminateColor }\"\r\n />\r\n <div \r\n class=\"absolute h-full w-1/3 animate-[indeterminate-linear_2s_infinite]\"\r\n :style=\"{ backgroundColor: linearIndeterminateColor }\"\r\n />\r\n </div>\r\n <!-- Determinate Linear -->\r\n <Progress v-else v-bind=\"mapped\" />\r\n </div>\r\n \r\n <!-- Circular Progress -->\r\n <div v-else-if=\"props.variant === 'circular'\" class=\"flex justify-center\">\r\n <div class=\"relative\" :style=\"{ width: circularStyle.size + 'px', height: circularStyle.size + 'px' }\">\r\n <!-- Indeterminate Circular -->\r\n <div v-if=\"props.indeterminate\">\r\n <svg class=\"w-full h-full animate-spin\" viewBox=\"0 0 100 100\">\r\n <circle\r\n cx=\"50\"\r\n cy=\"50\"\r\n r=\"45\"\r\n stroke=\"#e5e7eb\"\r\n stroke-width=\"8\"\r\n fill=\"none\"\r\n />\r\n <circle\r\n cx=\"50\"\r\n cy=\"50\"\r\n r=\"45\"\r\n :stroke=\"circularStyle.color\"\r\n stroke-width=\"8\"\r\n fill=\"none\"\r\n stroke-linecap=\"round\"\r\n stroke-dasharray=\"70 213\"\r\n stroke-dashoffset=\"0\"\r\n class=\"animate-[indeterminate-circular_2s_ease-in-out_infinite]\"\r\n />\r\n </svg>\r\n </div>\r\n <!-- Determinate Circular -->\r\n <div v-else>\r\n <svg class=\"w-full h-full transform -rotate-90\" viewBox=\"0 0 100 100\">\r\n <!-- Background circle -->\r\n <circle\r\n cx=\"50\"\r\n cy=\"50\"\r\n r=\"45\"\r\n stroke=\"#e5e7eb\"\r\n stroke-width=\"8\"\r\n fill=\"none\"\r\n />\r\n <!-- Progress circle -->\r\n <circle\r\n cx=\"50\"\r\n cy=\"50\"\r\n r=\"45\"\r\n :stroke=\"circularStyle.color\"\r\n stroke-width=\"8\"\r\n fill=\"none\"\r\n stroke-linecap=\"round\"\r\n :stroke-dasharray=\"283\"\r\n :stroke-dashoffset=\"283 - (283 * percentage / 100)\"\r\n class=\"transition-all duration-300 ease-in-out\"\r\n />\r\n </svg>\r\n </div>\r\n <!-- Center text -->\r\n <div v-if=\"props.showLabel || props.indeterminate\" class=\"absolute inset-0 flex items-center justify-center\">\r\n <span class=\"text-sm font-medium text-gray-700\">{{ indeterminateText }}</span>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Circular Progress용 하단 description -->\r\n <div v-if=\"props.variant === 'circular' && props.description\" class=\"text-center mt-2\">\r\n <p class=\"text-xs text-gray-500\">{{ props.description }}</p>\r\n </div>\r\n \r\n <!-- Linear Progress용 하단 description -->\r\n <p v-if=\"props.variant === 'linear' && props.description\" class=\"text-xs text-gray-500\">\r\n {{ props.description }}\r\n </p>\r\n </div>\r\n</template>\r\n\r\n<style>\r\n@keyframes indeterminate-linear {\r\n 0% {\r\n transform: translateX(-100%);\r\n }\r\n 100% {\r\n transform: translateX(400%);\r\n }\r\n}\r\n\r\n@keyframes indeterminate-circular {\r\n 0% {\r\n stroke-dasharray: 70 213;\r\n stroke-dashoffset: 0;\r\n }\r\n 50% {\r\n stroke-dasharray: 140 143;\r\n stroke-dashoffset: -70;\r\n }\r\n 100% {\r\n stroke-dasharray: 70 213;\r\n stroke-dashoffset: -213;\r\n }\r\n}\r\n</style>\r\n"],"names":["props","__props","STYLE_PRESETS","SIZE_PRESETS","CIRCULAR_SIZE_PRESETS","percentage","computed","mapped","stylePreset","sizePreset","finalClass","circularStyle","color","indeterminateText","linearIndeterminateColor","_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","_hoisted_3","_toDisplayString","_hoisted_4","_hoisted_5","_createElementVNode","_hoisted_6","_hoisted_7","_normalizeClass","_createBlock","Progress","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_12","_hoisted_13","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue");require("../shadcn/index.cjs");const m=require("../shadcn/RadioGroup.vue.cjs"),p=require("../shadcn/RadioGroupItem.vue.cjs"),g=["for"],f=e.defineComponent({__name:"JRadio",props:{modelValue:{},options:{default:()=>[]},disabled:{type:Boolean,default:!1},required:{type:Boolean,default:!1},name:{},id:{},class:{},styletype:{default:"default"}},emits:["update:modelValue","change"],setup(l,{emit:o}){const r=l,u=o,a={default:{groupClass:"",itemClass:""},primary:{groupClass:"",itemClass:"border-blue-500 text-blue-500"},success:{groupClass:"",itemClass:"border-green-500 text-green-600"},danger:{groupClass:"",itemClass:"border-destructive text-destructive"},sm:{groupClass:"",itemClass:"h-3.5 w-3.5"},lg:{groupClass:"",itemClass:"h-5 w-5"},horizontal:{groupClass:"flex flex-row gap-4",itemClass:""},vertical:{groupClass:"grid gap-2",itemClass:""}},i=e.computed(()=>{const t=r.styletype||"default";return[(a[t]??a.default)?.groupClass,r.class].filter(Boolean).join(" ")}),n=e.computed(()=>{const t=r.styletype||"default";return(a[t]??a.default)?.itemClass}),c=t=>{u("update:modelValue",t),u("change",t)};return(t,d)=>(e.openBlock(),e.createBlock(e.unref(m.default),{"model-value":String(l.modelValue),disabled:l.disabled,required:l.required,name:l.name,id:l.id,class:e.normalizeClass(i.value),"onUpdate:modelValue":c},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.options,s=>(e.openBlock(),e.createElementBlock("div",{key:s.value,class:e.normalizeClass(l.styletype==="vertical"?"block":"flex items-center space-x-2")},[e.createVNode(e.unref(p.default),{id:String(s.value),value:String(s.value),disabled:s.disabled,class:e.normalizeClass(n.value)},null,8,["id","value","disabled","class"]),e.createElementVNode("label",{for:String(s.value),class:"text-
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue");require("../shadcn/index.cjs");const m=require("../shadcn/RadioGroup.vue.cjs"),p=require("../shadcn/RadioGroupItem.vue.cjs"),g=["for"],f=e.defineComponent({__name:"JRadio",props:{modelValue:{},options:{default:()=>[]},disabled:{type:Boolean,default:!1},required:{type:Boolean,default:!1},name:{},id:{},class:{},styletype:{default:"default"}},emits:["update:modelValue","change"],setup(l,{emit:o}){const r=l,u=o,a={default:{groupClass:"",itemClass:""},primary:{groupClass:"",itemClass:"border-blue-500 text-blue-500"},success:{groupClass:"",itemClass:"border-green-500 text-green-600"},danger:{groupClass:"",itemClass:"border-destructive text-destructive"},sm:{groupClass:"",itemClass:"h-3.5 w-3.5"},lg:{groupClass:"",itemClass:"h-5 w-5"},horizontal:{groupClass:"flex flex-row gap-4",itemClass:""},vertical:{groupClass:"grid gap-2",itemClass:""}},i=e.computed(()=>{const t=r.styletype||"default";return[(a[t]??a.default)?.groupClass,r.class].filter(Boolean).join(" ")}),n=e.computed(()=>{const t=r.styletype||"default";return(a[t]??a.default)?.itemClass}),c=t=>{u("update:modelValue",t),u("change",t)};return(t,d)=>(e.openBlock(),e.createBlock(e.unref(m.default),{"model-value":String(l.modelValue),disabled:l.disabled,required:l.required,name:l.name,id:l.id,class:e.normalizeClass(i.value),"onUpdate:modelValue":c},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.options,s=>(e.openBlock(),e.createElementBlock("div",{key:s.value,class:e.normalizeClass(l.styletype==="vertical"?"block":"flex items-center space-x-2")},[e.createVNode(e.unref(p.default),{id:String(s.value),value:String(s.value),disabled:s.disabled,class:e.normalizeClass(n.value)},null,8,["id","value","disabled","class"]),e.createElementVNode("label",{for:String(s.value),class:"text-xs font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"},e.toDisplayString(s.label),9,g)],2))),128))]),_:1},8,["model-value","disabled","required","name","id","class"]))}});exports.default=f;
|
|
2
2
|
//# sourceMappingURL=JRadio.vue.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JRadio.vue.cjs","sources":["../../../../src/components/atoms/JRadio.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { RadioGroup, RadioGroupItem } from '@/components/shadcn'\r\n\r\nexport interface Option {\r\n value: string | number\r\n label: string\r\n disabled?: boolean\r\n}\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'primary' // 강조 스타일 (파랑)\r\n | 'success' // 성공 스타일 (초록)\r\n | 'danger' // 위험 스타일 (빨강)\r\n | 'sm' // 작은 크기\r\n | 'lg' // 큰 크기\r\n | 'horizontal' // 가로 배치\r\n | 'vertical' // 세로 배치\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: string | number\r\n options?: Option[]\r\n disabled?: boolean\r\n required?: boolean\r\n name?: string\r\n id?: string\r\n class?: string\r\n /** 스타일 프리셋 */\r\n styletype?: StyleType\r\n }>(),\r\n {\r\n options: () => [],\r\n disabled: false,\r\n required: false,\r\n styletype: 'default',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string | number]\r\n 'change': [value: string | number]\r\n}>()\r\n\r\n/**\r\n * styletype -> class 매핑\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, { groupClass: string; itemClass: string }> = {\r\n default: { \r\n groupClass: '',\r\n itemClass: '',\r\n },\r\n primary: { \r\n groupClass: '',\r\n itemClass: 'border-blue-500 text-blue-500',\r\n },\r\n success: { \r\n groupClass: '',\r\n itemClass: 'border-green-500 text-green-600',\r\n },\r\n danger: { \r\n groupClass: '',\r\n itemClass: 'border-destructive text-destructive',\r\n },\r\n sm: { \r\n groupClass: '',\r\n itemClass: 'h-3.5 w-3.5',\r\n },\r\n lg: { \r\n groupClass: '',\r\n itemClass: 'h-5 w-5',\r\n },\r\n horizontal: { \r\n groupClass: 'flex flex-row gap-4',\r\n itemClass: '',\r\n },\r\n vertical: { \r\n groupClass: 'grid gap-2',\r\n itemClass: '',\r\n },\r\n}\r\n\r\nconst groupClass = computed(() => {\r\n const styleKey = props.styletype || 'default'\r\n const preset = STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\r\n return [preset?.groupClass, props.class].filter(Boolean).join(' ')\r\n})\r\n\r\nconst itemClass = computed(() => {\r\n const styleKey = props.styletype || 'default'\r\n const preset = STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\r\n return preset?.itemClass\r\n})\r\n\r\nconst handleChange = (value: string) => {\r\n emit('update:modelValue', value)\r\n emit('change', value)\r\n}\r\n</script>\r\n\r\n<template>\r\n <RadioGroup \r\n :model-value=\"String(modelValue)\" \r\n :disabled=\"disabled\"\r\n :required=\"required\"\r\n :name=\"name\"\r\n :id=\"id\"\r\n :class=\"groupClass\" \r\n @update:model-value=\"handleChange\"\r\n >\r\n <div v-for=\"option in options\" :key=\"option.value\" :class=\"styletype === 'vertical' ? 'block' : 'flex items-center space-x-2'\">\r\n <RadioGroupItem \r\n :id=\"String(option.value)\" \r\n :value=\"String(option.value)\" \r\n :disabled=\"option.disabled\"\r\n :class=\"itemClass\"\r\n />\r\n <label\
|
|
1
|
+
{"version":3,"file":"JRadio.vue.cjs","sources":["../../../../src/components/atoms/JRadio.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { RadioGroup, RadioGroupItem } from '@/components/shadcn'\r\n\r\nexport interface Option {\r\n value: string | number\r\n label: string\r\n disabled?: boolean\r\n}\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'primary' // 강조 스타일 (파랑)\r\n | 'success' // 성공 스타일 (초록)\r\n | 'danger' // 위험 스타일 (빨강)\r\n | 'sm' // 작은 크기\r\n | 'lg' // 큰 크기\r\n | 'horizontal' // 가로 배치\r\n | 'vertical' // 세로 배치\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: string | number\r\n options?: Option[]\r\n disabled?: boolean\r\n required?: boolean\r\n name?: string\r\n id?: string\r\n class?: string\r\n /** 스타일 프리셋 */\r\n styletype?: StyleType\r\n }>(),\r\n {\r\n options: () => [],\r\n disabled: false,\r\n required: false,\r\n styletype: 'default',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string | number]\r\n 'change': [value: string | number]\r\n}>()\r\n\r\n/**\r\n * styletype -> class 매핑\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, { groupClass: string; itemClass: string }> = {\r\n default: { \r\n groupClass: '',\r\n itemClass: '',\r\n },\r\n primary: { \r\n groupClass: '',\r\n itemClass: 'border-blue-500 text-blue-500',\r\n },\r\n success: { \r\n groupClass: '',\r\n itemClass: 'border-green-500 text-green-600',\r\n },\r\n danger: { \r\n groupClass: '',\r\n itemClass: 'border-destructive text-destructive',\r\n },\r\n sm: { \r\n groupClass: '',\r\n itemClass: 'h-3.5 w-3.5',\r\n },\r\n lg: { \r\n groupClass: '',\r\n itemClass: 'h-5 w-5',\r\n },\r\n horizontal: { \r\n groupClass: 'flex flex-row gap-4',\r\n itemClass: '',\r\n },\r\n vertical: { \r\n groupClass: 'grid gap-2',\r\n itemClass: '',\r\n },\r\n}\r\n\r\nconst groupClass = computed(() => {\r\n const styleKey = props.styletype || 'default'\r\n const preset = STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\r\n return [preset?.groupClass, props.class].filter(Boolean).join(' ')\r\n})\r\n\r\nconst itemClass = computed(() => {\r\n const styleKey = props.styletype || 'default'\r\n const preset = STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\r\n return preset?.itemClass\r\n})\r\n\r\nconst handleChange = (value: string) => {\r\n emit('update:modelValue', value)\r\n emit('change', value)\r\n}\r\n</script>\r\n\r\n<template>\r\n <RadioGroup \r\n :model-value=\"String(modelValue)\" \r\n :disabled=\"disabled\"\r\n :required=\"required\"\r\n :name=\"name\"\r\n :id=\"id\"\r\n :class=\"groupClass\" \r\n @update:model-value=\"handleChange\"\r\n >\r\n <div v-for=\"option in options\" :key=\"option.value\" :class=\"styletype === 'vertical' ? 'block' : 'flex items-center space-x-2'\">\r\n <RadioGroupItem \r\n :id=\"String(option.value)\" \r\n :value=\"String(option.value)\" \r\n :disabled=\"option.disabled\"\r\n :class=\"itemClass\"\r\n />\r\n <label\n :for=\"String(option.value)\"\n class=\"text-xs font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {{ option.label }}\n </label>\n </div>\r\n </RadioGroup>\r\n</template>\r\n"],"names":["props","__props","emit","__emit","STYLE_PRESETS","groupClass","computed","styleKey","itemClass","handleChange","value","_createBlock","_unref","RadioGroup","_createElementBlock","_Fragment","_renderList","option","_createVNode","RadioGroupItem","_createElementVNode","_toDisplayString","_hoisted_1"],"mappings":"ghBAoBA,MAAMA,EAAQC,EAoBRC,EAAOC,EAQPC,EAA8E,CAClF,QAAS,CACP,WAAY,GACZ,UAAW,EAAA,EAEb,QAAS,CACP,WAAY,GACZ,UAAW,+BAAA,EAEb,QAAS,CACP,WAAY,GACZ,UAAW,iCAAA,EAEb,OAAQ,CACN,WAAY,GACZ,UAAW,qCAAA,EAEb,GAAI,CACF,WAAY,GACZ,UAAW,aAAA,EAEb,GAAI,CACF,WAAY,GACZ,UAAW,SAAA,EAEb,WAAY,CACV,WAAY,sBACZ,UAAW,EAAA,EAEb,SAAU,CACR,WAAY,aACZ,UAAW,EAAA,CACb,EAGIC,EAAaC,EAAAA,SAAS,IAAM,CAChC,MAAMC,EAAWP,EAAM,WAAa,UAEpC,MAAO,EADQI,EAAcG,CAAQ,GAAKH,EAAc,UACxC,WAAYJ,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,CACnE,CAAC,EAEKQ,EAAYF,EAAAA,SAAS,IAAM,CAC/B,MAAMC,EAAWP,EAAM,WAAa,UAEpC,OADeI,EAAcG,CAAQ,GAAKH,EAAc,UACzC,SACjB,CAAC,EAEKK,EAAgBC,GAAkB,CACtCR,EAAK,oBAAqBQ,CAAK,EAC/BR,EAAK,SAAUQ,CAAK,CACtB,8BAIEC,EAAAA,YAuBaC,EAAAA,MAAAC,EAAAA,OAAA,EAAA,CAtBV,cAAa,OAAOZ,EAAA,UAAU,EAC9B,SAAUA,EAAA,SACV,SAAUA,EAAA,SACV,KAAMA,EAAA,KACN,GAAIA,EAAA,GACJ,uBAAOI,EAAA,KAAU,EACjB,sBAAoBI,CAAA,qBAEhB,IAAyB,kBAA9BK,EAAAA,mBAaMC,EAAAA,SAAA,KAAAC,EAAAA,WAbgBf,EAAA,QAAVgB,kBAAZH,EAAAA,mBAaM,MAAA,CAb0B,IAAKG,EAAO,MAAQ,uBAAOhB,EAAA,YAAS,WAAA,QAAA,6BAAA,CAAA,GAClEiB,cAKEN,EAAAA,MAAAO,EAAAA,OAAA,EAAA,CAJC,GAAI,OAAOF,EAAO,KAAK,EACvB,MAAO,OAAOA,EAAO,KAAK,EAC1B,SAAUA,EAAO,SACjB,uBAAOT,EAAA,KAAS,CAAA,4CAEnBY,EAAAA,mBAKQ,QAAA,CAJL,IAAK,OAAOH,EAAO,KAAK,EACzB,MAAM,4FAAA,EAEHI,EAAAA,gBAAAJ,EAAO,KAAK,EAAA,EAAAK,CAAA,CAAA"}
|
|
@@ -80,7 +80,7 @@ const w = ["for"], L = /* @__PURE__ */ C({
|
|
|
80
80
|
}, null, 8, ["id", "value", "disabled", "class"]),
|
|
81
81
|
S("label", {
|
|
82
82
|
for: String(a.value),
|
|
83
|
-
class: "text-
|
|
83
|
+
class: "text-xs font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
|
|
84
84
|
}, V(a.label), 9, w)
|
|
85
85
|
], 2))), 128))
|
|
86
86
|
]),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JRadio.vue.js","sources":["../../../../src/components/atoms/JRadio.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { RadioGroup, RadioGroupItem } from '@/components/shadcn'\r\n\r\nexport interface Option {\r\n value: string | number\r\n label: string\r\n disabled?: boolean\r\n}\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'primary' // 강조 스타일 (파랑)\r\n | 'success' // 성공 스타일 (초록)\r\n | 'danger' // 위험 스타일 (빨강)\r\n | 'sm' // 작은 크기\r\n | 'lg' // 큰 크기\r\n | 'horizontal' // 가로 배치\r\n | 'vertical' // 세로 배치\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: string | number\r\n options?: Option[]\r\n disabled?: boolean\r\n required?: boolean\r\n name?: string\r\n id?: string\r\n class?: string\r\n /** 스타일 프리셋 */\r\n styletype?: StyleType\r\n }>(),\r\n {\r\n options: () => [],\r\n disabled: false,\r\n required: false,\r\n styletype: 'default',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string | number]\r\n 'change': [value: string | number]\r\n}>()\r\n\r\n/**\r\n * styletype -> class 매핑\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, { groupClass: string; itemClass: string }> = {\r\n default: { \r\n groupClass: '',\r\n itemClass: '',\r\n },\r\n primary: { \r\n groupClass: '',\r\n itemClass: 'border-blue-500 text-blue-500',\r\n },\r\n success: { \r\n groupClass: '',\r\n itemClass: 'border-green-500 text-green-600',\r\n },\r\n danger: { \r\n groupClass: '',\r\n itemClass: 'border-destructive text-destructive',\r\n },\r\n sm: { \r\n groupClass: '',\r\n itemClass: 'h-3.5 w-3.5',\r\n },\r\n lg: { \r\n groupClass: '',\r\n itemClass: 'h-5 w-5',\r\n },\r\n horizontal: { \r\n groupClass: 'flex flex-row gap-4',\r\n itemClass: '',\r\n },\r\n vertical: { \r\n groupClass: 'grid gap-2',\r\n itemClass: '',\r\n },\r\n}\r\n\r\nconst groupClass = computed(() => {\r\n const styleKey = props.styletype || 'default'\r\n const preset = STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\r\n return [preset?.groupClass, props.class].filter(Boolean).join(' ')\r\n})\r\n\r\nconst itemClass = computed(() => {\r\n const styleKey = props.styletype || 'default'\r\n const preset = STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\r\n return preset?.itemClass\r\n})\r\n\r\nconst handleChange = (value: string) => {\r\n emit('update:modelValue', value)\r\n emit('change', value)\r\n}\r\n</script>\r\n\r\n<template>\r\n <RadioGroup \r\n :model-value=\"String(modelValue)\" \r\n :disabled=\"disabled\"\r\n :required=\"required\"\r\n :name=\"name\"\r\n :id=\"id\"\r\n :class=\"groupClass\" \r\n @update:model-value=\"handleChange\"\r\n >\r\n <div v-for=\"option in options\" :key=\"option.value\" :class=\"styletype === 'vertical' ? 'block' : 'flex items-center space-x-2'\">\r\n <RadioGroupItem \r\n :id=\"String(option.value)\" \r\n :value=\"String(option.value)\" \r\n :disabled=\"option.disabled\"\r\n :class=\"itemClass\"\r\n />\r\n <label\
|
|
1
|
+
{"version":3,"file":"JRadio.vue.js","sources":["../../../../src/components/atoms/JRadio.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { RadioGroup, RadioGroupItem } from '@/components/shadcn'\r\n\r\nexport interface Option {\r\n value: string | number\r\n label: string\r\n disabled?: boolean\r\n}\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'primary' // 강조 스타일 (파랑)\r\n | 'success' // 성공 스타일 (초록)\r\n | 'danger' // 위험 스타일 (빨강)\r\n | 'sm' // 작은 크기\r\n | 'lg' // 큰 크기\r\n | 'horizontal' // 가로 배치\r\n | 'vertical' // 세로 배치\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: string | number\r\n options?: Option[]\r\n disabled?: boolean\r\n required?: boolean\r\n name?: string\r\n id?: string\r\n class?: string\r\n /** 스타일 프리셋 */\r\n styletype?: StyleType\r\n }>(),\r\n {\r\n options: () => [],\r\n disabled: false,\r\n required: false,\r\n styletype: 'default',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string | number]\r\n 'change': [value: string | number]\r\n}>()\r\n\r\n/**\r\n * styletype -> class 매핑\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, { groupClass: string; itemClass: string }> = {\r\n default: { \r\n groupClass: '',\r\n itemClass: '',\r\n },\r\n primary: { \r\n groupClass: '',\r\n itemClass: 'border-blue-500 text-blue-500',\r\n },\r\n success: { \r\n groupClass: '',\r\n itemClass: 'border-green-500 text-green-600',\r\n },\r\n danger: { \r\n groupClass: '',\r\n itemClass: 'border-destructive text-destructive',\r\n },\r\n sm: { \r\n groupClass: '',\r\n itemClass: 'h-3.5 w-3.5',\r\n },\r\n lg: { \r\n groupClass: '',\r\n itemClass: 'h-5 w-5',\r\n },\r\n horizontal: { \r\n groupClass: 'flex flex-row gap-4',\r\n itemClass: '',\r\n },\r\n vertical: { \r\n groupClass: 'grid gap-2',\r\n itemClass: '',\r\n },\r\n}\r\n\r\nconst groupClass = computed(() => {\r\n const styleKey = props.styletype || 'default'\r\n const preset = STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\r\n return [preset?.groupClass, props.class].filter(Boolean).join(' ')\r\n})\r\n\r\nconst itemClass = computed(() => {\r\n const styleKey = props.styletype || 'default'\r\n const preset = STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\r\n return preset?.itemClass\r\n})\r\n\r\nconst handleChange = (value: string) => {\r\n emit('update:modelValue', value)\r\n emit('change', value)\r\n}\r\n</script>\r\n\r\n<template>\r\n <RadioGroup \r\n :model-value=\"String(modelValue)\" \r\n :disabled=\"disabled\"\r\n :required=\"required\"\r\n :name=\"name\"\r\n :id=\"id\"\r\n :class=\"groupClass\" \r\n @update:model-value=\"handleChange\"\r\n >\r\n <div v-for=\"option in options\" :key=\"option.value\" :class=\"styletype === 'vertical' ? 'block' : 'flex items-center space-x-2'\">\r\n <RadioGroupItem \r\n :id=\"String(option.value)\" \r\n :value=\"String(option.value)\" \r\n :disabled=\"option.disabled\"\r\n :class=\"itemClass\"\r\n />\r\n <label\n :for=\"String(option.value)\"\n class=\"text-xs font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {{ option.label }}\n </label>\n </div>\r\n </RadioGroup>\r\n</template>\r\n"],"names":["props","__props","emit","__emit","STYLE_PRESETS","groupClass","computed","styleKey","itemClass","handleChange","value","_createBlock","_unref","RadioGroup","_createElementBlock","_Fragment","_renderList","option","_createVNode","RadioGroupItem","_createElementVNode","_toDisplayString","_hoisted_1"],"mappings":";;;;;;;;;;;;;;;;;;AAoBA,UAAMA,IAAQC,GAoBRC,IAAOC,GAQPC,IAA8E;AAAA,MAClF,SAAS;AAAA,QACP,YAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA,MAEb,SAAS;AAAA,QACP,YAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA,MAEb,SAAS;AAAA,QACP,YAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA,MAEb,QAAQ;AAAA,QACN,YAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA,MAEb,IAAI;AAAA,QACF,YAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA,MAEb,IAAI;AAAA,QACF,YAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA,MAEb,YAAY;AAAA,QACV,YAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA,MAEb,UAAU;AAAA,QACR,YAAY;AAAA,QACZ,WAAW;AAAA,MAAA;AAAA,IACb,GAGIC,IAAaC,EAAS,MAAM;AAChC,YAAMC,IAAWP,EAAM,aAAa;AAEpC,aAAO,EADQI,EAAcG,CAAQ,KAAKH,EAAc,UACxC,YAAYJ,EAAM,KAAK,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,IACnE,CAAC,GAEKQ,IAAYF,EAAS,MAAM;AAC/B,YAAMC,IAAWP,EAAM,aAAa;AAEpC,cADeI,EAAcG,CAAQ,KAAKH,EAAc,UACzC;AAAA,IACjB,CAAC,GAEKK,IAAe,CAACC,MAAkB;AACtC,MAAAR,EAAK,qBAAqBQ,CAAK,GAC/BR,EAAK,UAAUQ,CAAK;AAAA,IACtB;2BAIEC,EAuBaC,EAAAC,CAAA,GAAA;AAAA,MAtBV,eAAa,OAAOZ,EAAA,UAAU;AAAA,MAC9B,UAAUA,EAAA;AAAA,MACV,UAAUA,EAAA;AAAA,MACV,MAAMA,EAAA;AAAA,MACN,IAAIA,EAAA;AAAA,MACJ,SAAOI,EAAA,KAAU;AAAA,MACjB,uBAAoBI;AAAA,IAAA;iBAEhB,MAAyB;AAAA,gBAA9BK,EAaMC,GAAA,MAAAC,EAbgBf,EAAA,SAAO,CAAjBgB,YAAZH,EAaM,OAAA;AAAA,UAb0B,KAAKG,EAAO;AAAA,UAAQ,SAAOhB,EAAA,cAAS,aAAA,UAAA,6BAAA;AAAA,QAAA;UAClEiB,EAKEN,EAAAO,CAAA,GAAA;AAAA,YAJC,IAAI,OAAOF,EAAO,KAAK;AAAA,YACvB,OAAO,OAAOA,EAAO,KAAK;AAAA,YAC1B,UAAUA,EAAO;AAAA,YACjB,SAAOT,EAAA,KAAS;AAAA,UAAA;UAEnBY,EAKQ,SAAA;AAAA,YAJL,KAAK,OAAOH,EAAO,KAAK;AAAA,YACzB,OAAM;AAAA,UAAA,GAEHI,EAAAJ,EAAO,KAAK,GAAA,GAAAK,CAAA;AAAA,QAAA;;;;;;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),n=require("lucide-vue-next"),o=require("../../lib/utils.cjs");require("../shadcn/index.cjs");const
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("vue"),n=require("lucide-vue-next"),o=require("../../lib/utils.cjs");require("../shadcn/index.cjs");const b=require("../shadcn/Combobox.vue.cjs"),x=require("../shadcn/ComboboxAnchor.vue.cjs"),_=require("../shadcn/ComboboxTrigger.vue.cjs"),v=require("../shadcn/Button.vue.cjs"),C=require("../shadcn/ComboboxList.vue.cjs"),h=require("../shadcn/ComboboxInput.vue.cjs"),y=require("../shadcn/ComboboxEmpty.vue.cjs"),g=require("../shadcn/ComboboxGroup.vue.cjs"),V=require("../shadcn/ComboboxItem.vue.cjs"),q={class:"relative w-full max-w-sm items-center"},N={class:"absolute start-0 inset-y-0 flex items-center justify-center px-2.5"},w=e.defineComponent({__name:"JSearchCombo",props:{modelValue:{},options:{default:()=>[]},placeholder:{default:"선택해주세요."},searchPlaceholder:{default:""},emptyText:{default:"검색 결과가 없습니다."},disabled:{type:Boolean,default:!1},required:{type:Boolean,default:!1},name:{},id:{},multiple:{type:Boolean,default:!1},class:{},styletype:{default:"default"}},emits:["update:modelValue","change","focus","blur"],setup(t,{emit:c}){const d=t,r=c,i={default:{variant:"outline",buttonClass:"h-8 text-xs px-2.5"},error:{variant:"outline",buttonClass:"h-8 text-xs px-2.5 border-destructive text-destructive",inputClass:"border-destructive focus:ring-destructive"},success:{variant:"outline",buttonClass:"h-8 text-xs px-2.5 border-green-500 text-green-700",inputClass:"border-green-500 focus:ring-green-500"},warning:{variant:"outline",buttonClass:"h-8 text-xs px-2.5 border-amber-500 text-amber-700",inputClass:"border-amber-500 focus:ring-amber-500"},sm:{variant:"outline",buttonClass:"h-7 text-[11px] px-2",inputClass:"h-7 text-[11px] px-2 py-1"},lg:{variant:"outline",buttonClass:"h-10 text-sm px-3",inputClass:"h-10 text-sm px-3 py-2"}},s=e.computed(()=>{const a=d.styletype||"default";return i[a]??i.default}),p=e.computed(()=>o.cn("justify-between",s.value?.buttonClass,d.class)),f=e.computed(()=>o.cn("pl-8 pr-2 py-1.5 focus-visible:ring-0 border-0 border-b rounded-none h-8 text-xs",s.value?.inputClass)),m=a=>{r("update:modelValue",a),r("change",a)};return(a,l)=>(e.openBlock(),e.createBlock(e.unref(b.default),{"model-value":t.modelValue,by:"label",disabled:t.disabled,required:t.required,name:t.name,"onUpdate:modelValue":l[2]||(l[2]=u=>m(u))},{default:e.withCtx(()=>[e.createVNode(e.unref(x.default),{"as-child":""},{default:e.withCtx(()=>[e.createVNode(e.unref(_.default),{"as-child":""},{default:e.withCtx(()=>[e.createVNode(e.unref(v.default),{id:t.id,variant:s.value.variant,class:e.normalizeClass(p.value),disabled:t.disabled,onFocus:l[0]||(l[0]=u=>r("focus",u)),onBlur:l[1]||(l[1]=u=>r("blur",u))},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.modelValue?.label??t.placeholder)+" ",1),e.createVNode(e.unref(n.ChevronsUpDown),{class:"ml-2 h-3.5 w-3.5 shrink-0 opacity-50"})]),_:1},8,["id","variant","class","disabled"])]),_:1})]),_:1}),e.createVNode(e.unref(C.default),null,{default:e.withCtx(()=>[e.createElementVNode("div",q,[e.createVNode(e.unref(h.default),{class:e.normalizeClass(f.value),placeholder:t.searchPlaceholder},null,8,["class","placeholder"]),e.createElementVNode("span",N,[e.createVNode(e.unref(n.Search),{class:"size-3.5 text-muted-foreground"})])]),e.createVNode(e.unref(y.default),null,{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(t.emptyText),1)]),_:1}),e.createVNode(e.unref(g.default),null,{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.options,u=>(e.openBlock(),e.createBlock(e.unref(V.default),{key:u.value,value:u},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(u.label)+" ",1),t.modelValue?.value===u.value?(e.openBlock(),e.createBlock(e.unref(n.Check),{key:0,class:e.normalizeClass(e.unref(o.cn)("ml-auto h-3.5 w-3.5"))},null,8,["class"])):e.createCommentVNode("",!0)]),_:2},1032,["value"]))),128))]),_:1})]),_:1})]),_:1},8,["model-value","disabled","required","name"]))}});exports.default=w;
|
|
2
2
|
//# sourceMappingURL=JSearchCombo.vue.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JSearchCombo.vue.cjs","sources":["../../../../src/components/atoms/JSearchCombo.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { Check, ChevronsUpDown, Search } from 'lucide-vue-next'\r\nimport { cn } from '@/lib/utils'\r\nimport {\r\n Button,\r\n Combobox,\r\n ComboboxAnchor,\r\n ComboboxEmpty,\r\n ComboboxGroup,\r\n ComboboxInput,\r\n ComboboxItem,\r\n ComboboxList,\r\n ComboboxTrigger,\r\n} from '@/components/shadcn'\r\n\r\nexport interface ComboboxOption {\r\n value: string | number\r\n label: string\r\n}\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'error' // 에러 상태\r\n | 'success' // 성공 상태\r\n | 'warning' // 경고 상태\r\n | 'sm' // 작은 크기\r\n | 'lg' // 큰 크기\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: ComboboxOption\r\n options?: ComboboxOption[]\r\n placeholder?: string\r\n searchPlaceholder?: string\r\n emptyText?: string\r\n disabled?: boolean\r\n required?: boolean\r\n name?: string\r\n id?: string\r\n multiple?: boolean\r\n class?: string\r\n /** 스타일 프리셋 */\r\n styletype?: StyleType\r\n }>(),\r\n {\r\n options: () => [],\r\n placeholder: '선택해주세요.',\r\n searchPlaceholder: '',\r\n emptyText: '검색 결과가 없습니다.',\r\n disabled: false,\r\n required: false,\r\n multiple: false,\r\n styletype: 'default',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: ComboboxOption | undefined]\r\n 'change': [value: ComboboxOption | undefined]\r\n 'focus': [event: FocusEvent]\r\n 'blur': [event: FocusEvent]\r\n}>()\r\n\r\n/**\r\n * styletype -> variant/class 매핑\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, { variant: 'default' | 'outline' | 'destructive' | 'secondary' | 'ghost' | 'link', buttonClass?: string, inputClass?: string }> = {\
|
|
1
|
+
{"version":3,"file":"JSearchCombo.vue.cjs","sources":["../../../../src/components/atoms/JSearchCombo.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { Check, ChevronsUpDown, Search } from 'lucide-vue-next'\r\nimport { cn } from '@/lib/utils'\r\nimport {\r\n Button,\r\n Combobox,\r\n ComboboxAnchor,\r\n ComboboxEmpty,\r\n ComboboxGroup,\r\n ComboboxInput,\r\n ComboboxItem,\r\n ComboboxList,\r\n ComboboxTrigger,\r\n} from '@/components/shadcn'\r\n\r\nexport interface ComboboxOption {\r\n value: string | number\r\n label: string\r\n}\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'error' // 에러 상태\r\n | 'success' // 성공 상태\r\n | 'warning' // 경고 상태\r\n | 'sm' // 작은 크기\r\n | 'lg' // 큰 크기\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: ComboboxOption\r\n options?: ComboboxOption[]\r\n placeholder?: string\r\n searchPlaceholder?: string\r\n emptyText?: string\r\n disabled?: boolean\r\n required?: boolean\r\n name?: string\r\n id?: string\r\n multiple?: boolean\r\n class?: string\r\n /** 스타일 프리셋 */\r\n styletype?: StyleType\r\n }>(),\r\n {\r\n options: () => [],\r\n placeholder: '선택해주세요.',\r\n searchPlaceholder: '',\r\n emptyText: '검색 결과가 없습니다.',\r\n disabled: false,\r\n required: false,\r\n multiple: false,\r\n styletype: 'default',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: ComboboxOption | undefined]\r\n 'change': [value: ComboboxOption | undefined]\r\n 'focus': [event: FocusEvent]\r\n 'blur': [event: FocusEvent]\r\n}>()\r\n\r\n/**\r\n * styletype -> variant/class 매핑\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, { variant: 'default' | 'outline' | 'destructive' | 'secondary' | 'ghost' | 'link', buttonClass?: string, inputClass?: string }> = {\n default: { \n variant: 'outline',\n buttonClass: 'h-8 text-xs px-2.5',\n },\n error: { \n variant: 'outline',\n buttonClass: 'h-8 text-xs px-2.5 border-destructive text-destructive',\n inputClass: 'border-destructive focus:ring-destructive',\n },\n success: { \n variant: 'outline',\n buttonClass: 'h-8 text-xs px-2.5 border-green-500 text-green-700',\n inputClass: 'border-green-500 focus:ring-green-500',\n },\n warning: { \n variant: 'outline',\n buttonClass: 'h-8 text-xs px-2.5 border-amber-500 text-amber-700',\n inputClass: 'border-amber-500 focus:ring-amber-500',\n },\n sm: { \n variant: 'outline',\n buttonClass: 'h-7 text-[11px] px-2',\n inputClass: 'h-7 text-[11px] px-2 py-1',\n },\n lg: { \n variant: 'outline',\n buttonClass: 'h-10 text-sm px-3',\n inputClass: 'h-10 text-sm px-3 py-2',\n },\n}\n\r\nconst preset = computed(() => {\r\n const styleKey = props.styletype || 'default'\r\n return STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\r\n})\r\n\r\nconst buttonClass = computed(() => {\r\n return cn('justify-between', preset.value?.buttonClass, props.class)\r\n})\r\n\r\nconst inputClass = computed(() => {\n return cn('pl-8 pr-2 py-1.5 focus-visible:ring-0 border-0 border-b rounded-none h-8 text-xs', preset.value?.inputClass)\n})\n\r\nconst handleChange = (value: ComboboxOption | undefined) => {\r\n emit('update:modelValue', value)\r\n emit('change', value)\r\n}\r\n</script>\r\n\r\n<template>\r\n <Combobox \r\n :model-value=\"modelValue\" \r\n by=\"label\" \r\n :disabled=\"disabled\"\r\n :required=\"required\"\r\n :name=\"name\"\r\n @update:model-value=\"(value) => handleChange(value as ComboboxOption | undefined)\"\r\n >\r\n <ComboboxAnchor as-child>\r\n <ComboboxTrigger as-child>\r\n <Button \r\n :id=\"id\"\r\n :variant=\"preset.variant\" \r\n :class=\"buttonClass\"\r\n :disabled=\"disabled\"\r\n @focus=\"emit('focus', $event as FocusEvent)\"\r\n @blur=\"emit('blur', $event as FocusEvent)\"\r\n >\n {{ modelValue?.label ?? placeholder }}\n <ChevronsUpDown class=\"ml-2 h-3.5 w-3.5 shrink-0 opacity-50\" />\n </Button>\n </ComboboxTrigger>\r\n </ComboboxAnchor>\r\n\r\n <ComboboxList>\r\n <div class=\"relative w-full max-w-sm items-center\">\n <ComboboxInput :class=\"inputClass\" :placeholder=\"searchPlaceholder\" />\n <span class=\"absolute start-0 inset-y-0 flex items-center justify-center px-2.5\">\n <Search class=\"size-3.5 text-muted-foreground\" />\n </span>\n </div>\n\r\n <ComboboxEmpty>\r\n {{ emptyText }}\r\n </ComboboxEmpty>\r\n\r\n <ComboboxGroup>\r\n <ComboboxItem\r\n v-for=\"option in options\"\r\n :key=\"option.value\"\r\n :value=\"option\"\r\n >\r\n {{ option.label }}\n\n <Check v-if=\"modelValue?.value === option.value\" :class=\"cn('ml-auto h-3.5 w-3.5')\" />\n </ComboboxItem>\r\n </ComboboxGroup>\r\n </ComboboxList>\r\n </Combobox>\r\n</template>\r\n"],"names":["props","__props","emit","__emit","STYLE_PRESETS","preset","computed","styleKey","buttonClass","cn","inputClass","handleChange","value","_createBlock","_unref","Combobox","_cache","_createVNode","ComboboxAnchor","ComboboxTrigger","Button","$event","_createTextVNode","_toDisplayString","ChevronsUpDown","ComboboxList","_createElementVNode","_hoisted_1","ComboboxInput","_hoisted_2","Search","ComboboxEmpty","ComboboxGroup","_createElementBlock","_Fragment","_renderList","option","ComboboxItem","Check"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { defineComponent as $, computed as d, createBlock as m, openBlock as o, unref as t, withCtx as s, createVNode as
|
|
1
|
+
import { defineComponent as $, computed as d, createBlock as m, openBlock as o, unref as t, withCtx as s, createVNode as a, normalizeClass as c, createTextVNode as f, toDisplayString as p, createElementVNode as v, createElementBlock as w, Fragment as k, renderList as B, createCommentVNode as _ } from "vue";
|
|
2
2
|
import { ChevronsUpDown as S, Search as E, Check as T } from "lucide-vue-next";
|
|
3
|
-
import { cn as
|
|
3
|
+
import { cn as b } from "../../lib/utils.js";
|
|
4
4
|
import "../shadcn/index.js";
|
|
5
5
|
import q from "../shadcn/Combobox.vue.js";
|
|
6
6
|
import N from "../shadcn/ComboboxAnchor.vue.js";
|
|
@@ -11,7 +11,7 @@ import D from "../shadcn/ComboboxInput.vue.js";
|
|
|
11
11
|
import F from "../shadcn/ComboboxEmpty.vue.js";
|
|
12
12
|
import L from "../shadcn/ComboboxGroup.vue.js";
|
|
13
13
|
import U from "../shadcn/ComboboxItem.vue.js";
|
|
14
|
-
const J = { class: "relative w-full max-w-sm items-center" }, K = { class: "absolute start-0 inset-y-0 flex items-center justify-center px-
|
|
14
|
+
const J = { class: "relative w-full max-w-sm items-center" }, K = { class: "absolute start-0 inset-y-0 flex items-center justify-center px-2.5" }, te = /* @__PURE__ */ $({
|
|
15
15
|
__name: "JSearchCombo",
|
|
16
16
|
props: {
|
|
17
17
|
modelValue: {},
|
|
@@ -28,40 +28,41 @@ const J = { class: "relative w-full max-w-sm items-center" }, K = { class: "abso
|
|
|
28
28
|
styletype: { default: "default" }
|
|
29
29
|
},
|
|
30
30
|
emits: ["update:modelValue", "change", "focus", "blur"],
|
|
31
|
-
setup(e, { emit:
|
|
32
|
-
const
|
|
31
|
+
setup(e, { emit: C }) {
|
|
32
|
+
const x = e, u = C, h = {
|
|
33
33
|
default: {
|
|
34
|
-
variant: "outline"
|
|
34
|
+
variant: "outline",
|
|
35
|
+
buttonClass: "h-8 text-xs px-2.5"
|
|
35
36
|
},
|
|
36
37
|
error: {
|
|
37
38
|
variant: "outline",
|
|
38
|
-
buttonClass: "border-destructive text-destructive",
|
|
39
|
+
buttonClass: "h-8 text-xs px-2.5 border-destructive text-destructive",
|
|
39
40
|
inputClass: "border-destructive focus:ring-destructive"
|
|
40
41
|
},
|
|
41
42
|
success: {
|
|
42
43
|
variant: "outline",
|
|
43
|
-
buttonClass: "border-green-500 text-green-700",
|
|
44
|
+
buttonClass: "h-8 text-xs px-2.5 border-green-500 text-green-700",
|
|
44
45
|
inputClass: "border-green-500 focus:ring-green-500"
|
|
45
46
|
},
|
|
46
47
|
warning: {
|
|
47
48
|
variant: "outline",
|
|
48
|
-
buttonClass: "border-amber-500 text-amber-700",
|
|
49
|
+
buttonClass: "h-8 text-xs px-2.5 border-amber-500 text-amber-700",
|
|
49
50
|
inputClass: "border-amber-500 focus:ring-amber-500"
|
|
50
51
|
},
|
|
51
52
|
sm: {
|
|
52
53
|
variant: "outline",
|
|
53
|
-
buttonClass: "h-
|
|
54
|
-
inputClass: "h-
|
|
54
|
+
buttonClass: "h-7 text-[11px] px-2",
|
|
55
|
+
inputClass: "h-7 text-[11px] px-2 py-1"
|
|
55
56
|
},
|
|
56
57
|
lg: {
|
|
57
58
|
variant: "outline",
|
|
58
|
-
buttonClass: "h-
|
|
59
|
-
inputClass: "h-
|
|
59
|
+
buttonClass: "h-10 text-sm px-3",
|
|
60
|
+
inputClass: "h-10 text-sm px-3 py-2"
|
|
60
61
|
}
|
|
61
62
|
}, i = d(() => {
|
|
62
|
-
const n =
|
|
63
|
+
const n = x.styletype || "default";
|
|
63
64
|
return h[n] ?? h.default;
|
|
64
|
-
}), y = d(() =>
|
|
65
|
+
}), y = d(() => b("justify-between", i.value?.buttonClass, x.class)), g = d(() => b("pl-8 pr-2 py-1.5 focus-visible:ring-0 border-0 border-b rounded-none h-8 text-xs", i.value?.inputClass)), V = (n) => {
|
|
65
66
|
u("update:modelValue", n), u("change", n);
|
|
66
67
|
};
|
|
67
68
|
return (n, r) => (o(), m(t(q), {
|
|
@@ -70,24 +71,24 @@ const J = { class: "relative w-full max-w-sm items-center" }, K = { class: "abso
|
|
|
70
71
|
disabled: e.disabled,
|
|
71
72
|
required: e.required,
|
|
72
73
|
name: e.name,
|
|
73
|
-
"onUpdate:modelValue": r[2] || (r[2] = (
|
|
74
|
+
"onUpdate:modelValue": r[2] || (r[2] = (l) => V(l))
|
|
74
75
|
}, {
|
|
75
76
|
default: s(() => [
|
|
76
|
-
|
|
77
|
+
a(t(N), { "as-child": "" }, {
|
|
77
78
|
default: s(() => [
|
|
78
|
-
|
|
79
|
+
a(t(P), { "as-child": "" }, {
|
|
79
80
|
default: s(() => [
|
|
80
|
-
|
|
81
|
+
a(t(j), {
|
|
81
82
|
id: e.id,
|
|
82
83
|
variant: i.value.variant,
|
|
83
84
|
class: c(y.value),
|
|
84
85
|
disabled: e.disabled,
|
|
85
|
-
onFocus: r[0] || (r[0] = (
|
|
86
|
-
onBlur: r[1] || (r[1] = (
|
|
86
|
+
onFocus: r[0] || (r[0] = (l) => u("focus", l)),
|
|
87
|
+
onBlur: r[1] || (r[1] = (l) => u("blur", l))
|
|
87
88
|
}, {
|
|
88
89
|
default: s(() => [
|
|
89
|
-
f(
|
|
90
|
-
|
|
90
|
+
f(p(e.modelValue?.label ?? e.placeholder) + " ", 1),
|
|
91
|
+
a(t(S), { class: "ml-2 h-3.5 w-3.5 shrink-0 opacity-50" })
|
|
91
92
|
]),
|
|
92
93
|
_: 1
|
|
93
94
|
}, 8, ["id", "variant", "class", "disabled"])
|
|
@@ -97,34 +98,34 @@ const J = { class: "relative w-full max-w-sm items-center" }, K = { class: "abso
|
|
|
97
98
|
]),
|
|
98
99
|
_: 1
|
|
99
100
|
}),
|
|
100
|
-
|
|
101
|
+
a(t(z), null, {
|
|
101
102
|
default: s(() => [
|
|
102
|
-
|
|
103
|
-
|
|
103
|
+
v("div", J, [
|
|
104
|
+
a(t(D), {
|
|
104
105
|
class: c(g.value),
|
|
105
106
|
placeholder: e.searchPlaceholder
|
|
106
107
|
}, null, 8, ["class", "placeholder"]),
|
|
107
|
-
|
|
108
|
-
|
|
108
|
+
v("span", K, [
|
|
109
|
+
a(t(E), { class: "size-3.5 text-muted-foreground" })
|
|
109
110
|
])
|
|
110
111
|
]),
|
|
111
|
-
|
|
112
|
+
a(t(F), null, {
|
|
112
113
|
default: s(() => [
|
|
113
|
-
f(
|
|
114
|
+
f(p(e.emptyText), 1)
|
|
114
115
|
]),
|
|
115
116
|
_: 1
|
|
116
117
|
}),
|
|
117
|
-
|
|
118
|
+
a(t(L), null, {
|
|
118
119
|
default: s(() => [
|
|
119
|
-
(o(!0), w(k, null, B(e.options, (
|
|
120
|
-
key:
|
|
121
|
-
value:
|
|
120
|
+
(o(!0), w(k, null, B(e.options, (l) => (o(), m(t(U), {
|
|
121
|
+
key: l.value,
|
|
122
|
+
value: l
|
|
122
123
|
}, {
|
|
123
124
|
default: s(() => [
|
|
124
|
-
f(
|
|
125
|
-
e.modelValue?.value ===
|
|
125
|
+
f(p(l.label) + " ", 1),
|
|
126
|
+
e.modelValue?.value === l.value ? (o(), m(t(T), {
|
|
126
127
|
key: 0,
|
|
127
|
-
class: c(t(
|
|
128
|
+
class: c(t(b)("ml-auto h-3.5 w-3.5"))
|
|
128
129
|
}, null, 8, ["class"])) : _("", !0)
|
|
129
130
|
]),
|
|
130
131
|
_: 2
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JSearchCombo.vue.js","sources":["../../../../src/components/atoms/JSearchCombo.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { Check, ChevronsUpDown, Search } from 'lucide-vue-next'\r\nimport { cn } from '@/lib/utils'\r\nimport {\r\n Button,\r\n Combobox,\r\n ComboboxAnchor,\r\n ComboboxEmpty,\r\n ComboboxGroup,\r\n ComboboxInput,\r\n ComboboxItem,\r\n ComboboxList,\r\n ComboboxTrigger,\r\n} from '@/components/shadcn'\r\n\r\nexport interface ComboboxOption {\r\n value: string | number\r\n label: string\r\n}\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'error' // 에러 상태\r\n | 'success' // 성공 상태\r\n | 'warning' // 경고 상태\r\n | 'sm' // 작은 크기\r\n | 'lg' // 큰 크기\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: ComboboxOption\r\n options?: ComboboxOption[]\r\n placeholder?: string\r\n searchPlaceholder?: string\r\n emptyText?: string\r\n disabled?: boolean\r\n required?: boolean\r\n name?: string\r\n id?: string\r\n multiple?: boolean\r\n class?: string\r\n /** 스타일 프리셋 */\r\n styletype?: StyleType\r\n }>(),\r\n {\r\n options: () => [],\r\n placeholder: '선택해주세요.',\r\n searchPlaceholder: '',\r\n emptyText: '검색 결과가 없습니다.',\r\n disabled: false,\r\n required: false,\r\n multiple: false,\r\n styletype: 'default',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: ComboboxOption | undefined]\r\n 'change': [value: ComboboxOption | undefined]\r\n 'focus': [event: FocusEvent]\r\n 'blur': [event: FocusEvent]\r\n}>()\r\n\r\n/**\r\n * styletype -> variant/class 매핑\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, { variant: 'default' | 'outline' | 'destructive' | 'secondary' | 'ghost' | 'link', buttonClass?: string, inputClass?: string }> = {\
|
|
1
|
+
{"version":3,"file":"JSearchCombo.vue.js","sources":["../../../../src/components/atoms/JSearchCombo.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport { Check, ChevronsUpDown, Search } from 'lucide-vue-next'\r\nimport { cn } from '@/lib/utils'\r\nimport {\r\n Button,\r\n Combobox,\r\n ComboboxAnchor,\r\n ComboboxEmpty,\r\n ComboboxGroup,\r\n ComboboxInput,\r\n ComboboxItem,\r\n ComboboxList,\r\n ComboboxTrigger,\r\n} from '@/components/shadcn'\r\n\r\nexport interface ComboboxOption {\r\n value: string | number\r\n label: string\r\n}\r\n\r\ntype StyleType =\r\n | 'default' // 기본 스타일\r\n | 'error' // 에러 상태\r\n | 'success' // 성공 상태\r\n | 'warning' // 경고 상태\r\n | 'sm' // 작은 크기\r\n | 'lg' // 큰 크기\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n modelValue?: ComboboxOption\r\n options?: ComboboxOption[]\r\n placeholder?: string\r\n searchPlaceholder?: string\r\n emptyText?: string\r\n disabled?: boolean\r\n required?: boolean\r\n name?: string\r\n id?: string\r\n multiple?: boolean\r\n class?: string\r\n /** 스타일 프리셋 */\r\n styletype?: StyleType\r\n }>(),\r\n {\r\n options: () => [],\r\n placeholder: '선택해주세요.',\r\n searchPlaceholder: '',\r\n emptyText: '검색 결과가 없습니다.',\r\n disabled: false,\r\n required: false,\r\n multiple: false,\r\n styletype: 'default',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: ComboboxOption | undefined]\r\n 'change': [value: ComboboxOption | undefined]\r\n 'focus': [event: FocusEvent]\r\n 'blur': [event: FocusEvent]\r\n}>()\r\n\r\n/**\r\n * styletype -> variant/class 매핑\r\n */\r\nconst STYLE_PRESETS: Record<StyleType, { variant: 'default' | 'outline' | 'destructive' | 'secondary' | 'ghost' | 'link', buttonClass?: string, inputClass?: string }> = {\n default: { \n variant: 'outline',\n buttonClass: 'h-8 text-xs px-2.5',\n },\n error: { \n variant: 'outline',\n buttonClass: 'h-8 text-xs px-2.5 border-destructive text-destructive',\n inputClass: 'border-destructive focus:ring-destructive',\n },\n success: { \n variant: 'outline',\n buttonClass: 'h-8 text-xs px-2.5 border-green-500 text-green-700',\n inputClass: 'border-green-500 focus:ring-green-500',\n },\n warning: { \n variant: 'outline',\n buttonClass: 'h-8 text-xs px-2.5 border-amber-500 text-amber-700',\n inputClass: 'border-amber-500 focus:ring-amber-500',\n },\n sm: { \n variant: 'outline',\n buttonClass: 'h-7 text-[11px] px-2',\n inputClass: 'h-7 text-[11px] px-2 py-1',\n },\n lg: { \n variant: 'outline',\n buttonClass: 'h-10 text-sm px-3',\n inputClass: 'h-10 text-sm px-3 py-2',\n },\n}\n\r\nconst preset = computed(() => {\r\n const styleKey = props.styletype || 'default'\r\n return STYLE_PRESETS[styleKey] ?? STYLE_PRESETS.default\r\n})\r\n\r\nconst buttonClass = computed(() => {\r\n return cn('justify-between', preset.value?.buttonClass, props.class)\r\n})\r\n\r\nconst inputClass = computed(() => {\n return cn('pl-8 pr-2 py-1.5 focus-visible:ring-0 border-0 border-b rounded-none h-8 text-xs', preset.value?.inputClass)\n})\n\r\nconst handleChange = (value: ComboboxOption | undefined) => {\r\n emit('update:modelValue', value)\r\n emit('change', value)\r\n}\r\n</script>\r\n\r\n<template>\r\n <Combobox \r\n :model-value=\"modelValue\" \r\n by=\"label\" \r\n :disabled=\"disabled\"\r\n :required=\"required\"\r\n :name=\"name\"\r\n @update:model-value=\"(value) => handleChange(value as ComboboxOption | undefined)\"\r\n >\r\n <ComboboxAnchor as-child>\r\n <ComboboxTrigger as-child>\r\n <Button \r\n :id=\"id\"\r\n :variant=\"preset.variant\" \r\n :class=\"buttonClass\"\r\n :disabled=\"disabled\"\r\n @focus=\"emit('focus', $event as FocusEvent)\"\r\n @blur=\"emit('blur', $event as FocusEvent)\"\r\n >\n {{ modelValue?.label ?? placeholder }}\n <ChevronsUpDown class=\"ml-2 h-3.5 w-3.5 shrink-0 opacity-50\" />\n </Button>\n </ComboboxTrigger>\r\n </ComboboxAnchor>\r\n\r\n <ComboboxList>\r\n <div class=\"relative w-full max-w-sm items-center\">\n <ComboboxInput :class=\"inputClass\" :placeholder=\"searchPlaceholder\" />\n <span class=\"absolute start-0 inset-y-0 flex items-center justify-center px-2.5\">\n <Search class=\"size-3.5 text-muted-foreground\" />\n </span>\n </div>\n\r\n <ComboboxEmpty>\r\n {{ emptyText }}\r\n </ComboboxEmpty>\r\n\r\n <ComboboxGroup>\r\n <ComboboxItem\r\n v-for=\"option in options\"\r\n :key=\"option.value\"\r\n :value=\"option\"\r\n >\r\n {{ option.label }}\n\n <Check v-if=\"modelValue?.value === option.value\" :class=\"cn('ml-auto h-3.5 w-3.5')\" />\n </ComboboxItem>\r\n </ComboboxGroup>\r\n </ComboboxList>\r\n </Combobox>\r\n</template>\r\n"],"names":["props","__props","emit","__emit","STYLE_PRESETS","preset","computed","styleKey","buttonClass","cn","inputClass","handleChange","value","_createBlock","_unref","Combobox","_cache","_createVNode","ComboboxAnchor","ComboboxTrigger","Button","$event","_createTextVNode","_toDisplayString","ChevronsUpDown","ComboboxList","_createElementVNode","_hoisted_1","ComboboxInput","_hoisted_2","Search","ComboboxEmpty","ComboboxGroup","_createElementBlock","_Fragment","_renderList","option","ComboboxItem","Check"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./JSectionTitle.vue2.cjs");;/* empty css */const t = (t_comp, t_opts) => {
|
|
2
|
+
const t_merged = t_comp.__vccOpts || t_comp;
|
|
3
|
+
for (const [t_key, t_val] of t_opts)
|
|
4
|
+
t_merged[t_key] = t_val;
|
|
5
|
+
return t_merged;
|
|
6
|
+
};,u=t(e.default,[["__scopeId","data-v-7f6e5ace"]]);exports.default=u;
|
|
7
|
+
//# sourceMappingURL=JSectionTitle.vue.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JSectionTitle.vue.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|