diff --git a/components/Checkbox/src/index.svelte b/components/Checkbox/src/index.svelte index 72e5de9b..baeeacad 100644 --- a/components/Checkbox/src/index.svelte +++ b/components/Checkbox/src/index.svelte @@ -18,6 +18,10 @@ export let indeterminate: KCheckboxProps['indeterminate'] = false; export let cls: KCheckboxProps['cls'] = undefined; export let attrs: KCheckboxProps['attrs'] = {}; + /** + * @internal + */ + export let canCancel: KCheckboxProps['canCancel'] = false; // updateValue const dispatch = createEventDispatcher(); @@ -43,6 +47,9 @@ */ const handleUpdateValue = () => { if (isDisabled) return; + if (canCancel && valueInner) { + return; + } doUpdatedValue(!valueInner, true); isIndeterminate = false; // Being in a checkbox group does not trigger it diff --git a/components/Checkbox/src/types.d.ts b/components/Checkbox/src/types.d.ts index 782610e8..bf341f51 100644 --- a/components/Checkbox/src/types.d.ts +++ b/components/Checkbox/src/types.d.ts @@ -8,6 +8,7 @@ export type KCheckboxProps = { bgUnCheckColor: string; label: string; value: boolean; + canCancel: boolean; uid: string | number; size: IKunSize; disabled: boolean; diff --git a/components/CheckboxGroup/src/index.svelte b/components/CheckboxGroup/src/index.svelte index e17b790c..81c09226 100644 --- a/components/CheckboxGroup/src/index.svelte +++ b/components/CheckboxGroup/src/index.svelte @@ -35,7 +35,7 @@ } onMount(() => { // Register event, KForm can set KInput value - if (formContext && formInstance) { + if (formContext && formInstance && field) { formUpdateField(true); formPropsChangeCb(formInstance.__dynamicProps); formInstance.__itemCompMap[field] = { diff --git a/components/ColorPicker/__test__/color-picker.spec.ts b/components/ColorPicker/__test__/color-picker.spec.ts new file mode 100644 index 00000000..72baecd3 --- /dev/null +++ b/components/ColorPicker/__test__/color-picker.spec.ts @@ -0,0 +1,32 @@ +import { afterEach, beforeEach, describe, expect, test, vi } from 'vitest'; +import KColorPicker from '../src'; + +let host; + +const initHost = () => { + host = globalThis.document.createElement('div'); + host.setAttribute('id', 'host'); + globalThis.document.body.appendChild(host); +}; +beforeEach(() => { + initHost(); + vi.useFakeTimers(); +}); +afterEach(() => { + host.remove(); + vi.useRealTimers(); +}); + +describe('Test: KColorPicker', () => { + test('props: cls', async () => { + const instance = new KColorPicker({ + target: host, + props: { + cls: 'k-color-picker--test' + } + }); + expect(instance).toBeTruthy(); + expect(host!.innerHTML.includes('k-color-picker--test')).toBeTruthy(); + expect(host.innerHTML).matchSnapshot(); + }); +}); diff --git a/components/ColorPicker/package.json b/components/ColorPicker/package.json new file mode 100644 index 00000000..b1acf5c9 --- /dev/null +++ b/components/ColorPicker/package.json @@ -0,0 +1,56 @@ +{ + "name": "@ikun-ui/color-picker", + "version": "0.2.1", + "type": "module", + "main": "src/index.ts", + "types": "src/index.d.ts", + "svelte": "src/index.ts", + "keywords": [ + "svelte", + "svelte3", + "web component", + "component", + "react", + "vue", + "svelte-kit", + "dx" + ], + "files": [ + "dist", + "package.json" + ], + "scripts": { + "build": "svelte-package -i src", + "publish:pre": "node ../../scripts/pre-publish.js", + "publish:npm": "pnpm run publish:pre && pnpm publish --no-git-checks --access public" + }, + "publishConfig": { + "access": "public", + "main": "dist/index.js", + "module": "dist/index.js", + "svelte": "dist/index.js", + "types": "dist/index.d.ts" + }, + "dependencies": { + "@ikun-ui/icon": "workspace:*", + "@ikun-ui/popover": "workspace:*", + "@ikun-ui/input": "workspace:*", + "@ikun-ui/input-number": "workspace:*", + "@ikun-ui/dropdown": "workspace:*", + "@ikun-ui/checkbox": "workspace:*", + "@ikun-ui/checkbox-group": "workspace:*", + "@ikun-ui/utils": "workspace:*", + "esm-env": "^1.0.0", + "tinycolor2": "^1.6.0", + "baiwusanyu-utils": "^1.0.18", + "clsx": "^2.0.0", + "svelte": "^4.2.7" + }, + "devDependencies": { + "@sveltejs/package": "^2.2.5", + "@tsconfig/svelte": "^5.0.2", + "@types/tinycolor2": "^1.4.6", + "tslib": "^2.6.2", + "typescript": "^5.3.3" + } +} diff --git a/components/ColorPicker/src/block.svelte b/components/ColorPicker/src/block.svelte new file mode 100644 index 00000000..0c678dcc --- /dev/null +++ b/components/ColorPicker/src/block.svelte @@ -0,0 +1,54 @@ + + +{#if trigger} +
+
+
+
+ +
+{:else} +
+
+
+{/if} diff --git a/components/ColorPicker/src/format.svelte b/components/ColorPicker/src/format.svelte new file mode 100644 index 00000000..162f943d --- /dev/null +++ b/components/ColorPicker/src/format.svelte @@ -0,0 +1,195 @@ + + +
+ +
+ {curFormat} + +
+
+ RGB + HEX + HSV +
+
+ {#if formatValue !== 'hex'} + handleInput(e, 'hr')} + cls={inputNumCls} + size="sm" + > + handleInput(e, 'sg')} + cls={inputNumCls} + size="sm" + > + + handleInput(e, 'vb')} + cls={inputNumCls} + size="sm" + > + {/if} + {#if formatValue === 'hex'} + handleInput(e, 'hex')} size="sm"> + # + + {/if} + {#if !disabledAlpha} + handleInput(e, 'a')} + cls={inputNumCls} + size="sm" + > + {/if} +
diff --git a/components/ColorPicker/src/index.svelte b/components/ColorPicker/src/index.svelte new file mode 100644 index 00000000..a5d223b1 --- /dev/null +++ b/components/ColorPicker/src/index.svelte @@ -0,0 +1,245 @@ + + + +
+ {#if $$slots.default} + + {:else} + +
+ {#if showText} + + {formatColor(formatValue, blockColor)} + + {/if} +
+
+ {/if} +
+
+
+ + {title} + + {#if allowClear} + + {/if} +
+
+ +
+
+ + {#if !disabledAlpha} + + {/if} +
+ +
+ + + {#if presets && presets.length} + + {/if} + +
+
+
diff --git a/components/ColorPicker/src/index.ts b/components/ColorPicker/src/index.ts new file mode 100644 index 00000000..4f4cd64e --- /dev/null +++ b/components/ColorPicker/src/index.ts @@ -0,0 +1,23 @@ +/// +import ColorPicker from './index.svelte'; +import ColorPickerPalette from './palette.svelte'; +import ColorPickerSlider from './slider.svelte'; +import ColorPickerBlock from './block.svelte'; +import ColorPickerFormat from './format.svelte'; +import ColorPickerPreset from './preset.svelte'; +export { ColorPicker as KColorPicker }; +export { ColorPickerPalette as KColorPickerPalette }; +export { ColorPickerSlider as KColorPickerSlider }; +export { ColorPickerBlock as KColorPickerBlock }; +export { ColorPickerFormat as KColorPickerFormat }; +export { ColorPickerPreset as KColorPickerPreset }; +export default ColorPicker; + +export type { + KColorPickerProps, + KColorPickerPaletteProps, + KColorPickerSliderProps, + KColorPickerBlockProps, + KColorPickerFormatProps, + KColorPickerPresetProps +} from './types'; diff --git a/components/ColorPicker/src/palette.svelte b/components/ColorPicker/src/palette.svelte new file mode 100644 index 00000000..e7e5be8a --- /dev/null +++ b/components/ColorPicker/src/palette.svelte @@ -0,0 +1,157 @@ + + + diff --git a/components/ColorPicker/src/preset.svelte b/components/ColorPicker/src/preset.svelte new file mode 100644 index 00000000..187659ca --- /dev/null +++ b/components/ColorPicker/src/preset.svelte @@ -0,0 +1,85 @@ + + +
+ + {#each normalPresets as preset, index (preset.label + index)} +
+
handleExpend(index)} aria-hidden="true"> + + {preset.label} +
+ {#if preset.defaultOpen} +
+ {#each preset.colors as color (color)} + + {/each} +
+ {/if} +
+ {/each} +
+
diff --git a/components/ColorPicker/src/slider.svelte b/components/ColorPicker/src/slider.svelte new file mode 100644 index 00000000..504fb6b7 --- /dev/null +++ b/components/ColorPicker/src/slider.svelte @@ -0,0 +1,102 @@ + + + +