From 95aa6f68b316d02c28d1124d9a826bca55cde81f Mon Sep 17 00:00:00 2001 From: max <57699643+maxsteinwand@users.noreply.github.com> Date: Tue, 12 Nov 2024 16:11:06 +0100 Subject: [PATCH] feat(PinInput): implement component (#2570) Co-authored-by: Max Steinwand Co-authored-by: Benjamin Canac Co-authored-by: Romain Hamel --- docs/app/components/content/ComponentCode.vue | 2 +- .../examples/form/FormExampleElements.vue | 13 +- docs/content/3.components/pin-input.md | 181 ++++++++++++++++ playground-vue/src/app.vue | 1 + playground/app/app.vue | 1 + playground/app/pages/components/pin-input.vue | 52 +++++ src/runtime/components/PinInput.vue | 95 +++++++++ src/runtime/types/index.ts | 1 + src/theme/index.ts | 1 + src/theme/input-menu.ts | 2 +- src/theme/input.ts | 10 +- src/theme/pin-input.ts | 63 ++++++ test/components/PinInput.spec.ts | 130 ++++++++++++ .../ButtonGroup-vue.spec.ts.snap | 14 +- .../__snapshots__/ButtonGroup.spec.ts.snap | 14 +- .../CommandPalette-vue.spec.ts.snap | 46 ++-- .../__snapshots__/CommandPalette.spec.ts.snap | 46 ++-- .../__snapshots__/Form-vue.spec.ts.snap | 56 ++--- .../__snapshots__/Form.spec.ts.snap | 56 ++--- .../__snapshots__/Input-vue.spec.ts.snap | 80 +++---- .../__snapshots__/Input.spec.ts.snap | 80 +++---- .../__snapshots__/InputMenu-vue.spec.ts.snap | 104 +++++----- .../__snapshots__/InputMenu.spec.ts.snap | 104 +++++----- .../__snapshots__/PinInput-vue.spec.ts.snap | 196 ++++++++++++++++++ .../__snapshots__/PinInput.spec.ts.snap | 196 ++++++++++++++++++ .../__snapshots__/Select-vue.spec.ts.snap | 98 ++++----- .../__snapshots__/Select.spec.ts.snap | 98 ++++----- .../__snapshots__/SelectMenu-vue.spec.ts.snap | 196 +++++++++--------- .../__snapshots__/SelectMenu.spec.ts.snap | 196 +++++++++--------- .../__snapshots__/Textarea-vue.spec.ts.snap | 48 ++--- .../__snapshots__/Textarea.spec.ts.snap | 48 ++--- test/utils/form.ts | 6 +- 32 files changed, 1580 insertions(+), 654 deletions(-) create mode 100644 docs/content/3.components/pin-input.md create mode 100644 playground/app/pages/components/pin-input.vue create mode 100644 src/runtime/components/PinInput.vue create mode 100644 src/theme/pin-input.ts create mode 100644 test/components/PinInput.spec.ts create mode 100644 test/components/__snapshots__/PinInput-vue.spec.ts.snap create mode 100644 test/components/__snapshots__/PinInput.spec.ts.snap diff --git a/docs/app/components/content/ComponentCode.vue b/docs/app/components/content/ComponentCode.vue index f8c69622..562dc1a4 100644 --- a/docs/app/components/content/ComponentCode.vue +++ b/docs/app/components/content/ComponentCode.vue @@ -164,7 +164,7 @@ const code = computed(() => { continue } - code += ` ${prop?.type.includes('number') ? ':' : ''}${name}="${value}"` + code += ` ${typeof value === 'number' ? ':' : ''}${name}="${value}"` } } diff --git a/docs/app/components/content/examples/form/FormExampleElements.vue b/docs/app/components/content/examples/form/FormExampleElements.vue index d01da473..5b255a3e 100644 --- a/docs/app/components/content/examples/form/FormExampleElements.vue +++ b/docs/app/components/content/examples/form/FormExampleElements.vue @@ -29,10 +29,11 @@ const schema = z.object({ radioGroup: z.string().refine(value => value === 'option-2', { message: 'Select Option 2' }), - slider: z.number().max(20, { message: 'Must be less than 20' }) + slider: z.number().max(20, { message: 'Must be less than 20' }), + pin: z.string().regex(/^\d$/).array().length(5) }) -type Schema = z.output +type Schema = z.input const state = reactive>({}) @@ -52,7 +53,7 @@ async function onSubmit(event: FormSubmitEvent) {