Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Builtin control components #30

Open
10 of 12 tasks
Akryum opened this issue Feb 18, 2022 · 27 comments
Open
10 of 12 tasks

Builtin control components #30

Akryum opened this issue Feb 18, 2022 · 27 comments
Assignees
Labels
enhancement New feature or request good first issue Good for newcomers in progress need spec Need Specs, UX or UI design...

Comments

@Akryum
Copy link
Member

Akryum commented Feb 18, 2022

  • Text input
  • Textarea
  • Number input
  • Checkbox
  • Select
  • Button group
  • Radio list
  • Checkbox list
  • Slider
  • Date/hour
  • Color picker
  • JSON code editor
@Akryum Akryum added enhancement New feature or request need spec Need Specs, UX or UI design... labels Feb 18, 2022
@hugoattal
Copy link
Collaborator

hugoattal commented Feb 18, 2022

I suggest also adding Number input, Slider, Date/Hour, Radio list, Color picker, Textarea, and JSON (with syntax highlight if possible)

Also, I suggest using a checkbox for a boolean (compared to a switch).
UX-wise, I believe switch means deciding between two states (dark/light mode for example), whereas checkbox is quite literally a boolean (checked or not checked)

@hugoattal
Copy link
Collaborator

I think we need to have some kind of ways to specify how to display those controls.
I suggest adding a controls attribute to variant, here's what it would look like:

<script lang="ts" setup>
import { BooleanCtrl, InputCtrl, SliderCtrl } from '@histoire/controls'
import MyComponent from './MyComponent.vue'
import MyCustomControlComponentfrom './MyCustomControlComponent.vue'

function initState () {
  return {
    disabled: false,
    padding: 2,
    size: 20,
    customData: {},
  }
}

const controls = {
  disabled: BooleanCtrl,
  padding: {
    type: InputCtrl,
  },
  size: {
    type: SliderCtrl,
    options: {
      min: 0,
      max: 10,
      step: 2,
    },
  },
  customData: {
    type: MyCustomControlComponent
  },
}
</script>

<template>
  <Story
    title="My thing"
    :init-state="initState"
    :controls="controls"
  >
    <template #default="{ state }">
      <MyComponent v-bind="state" />
    </template>
  </Story>
</template>

Here are some different ways to define a control:

The standard way, just specify what kind of control you want

const controls = {
  size: SliderCtrl,
}

This is an equivalent to previous example

const controls = {
  size: {
    type: SliderCtrl,
  }
}

Here you can add options to the controls (depending on what's available)

const controls = {
  size: {
    type: SliderCtrl,
    options: {
      min: 0,
      max: 10,
      step: 2,
    },
  }
}

Also, you would be able to provide your own controls (with options) like this:

const controls = {
  size: {
    type: CustomControlComponent,
    options: {
      weirdOption: 2,
    },
  },
}

Basically, anyone would be able to create their own controls for their specific purpose.
And lastly, you would also be able to use the control template to be even more free to do anything you want.

Wdyt?

@hugoattal
Copy link
Collaborator

Also, controls would be automatically inferred from the type of value if not specified.

@Akryum
Copy link
Member Author

Akryum commented Mar 17, 2022

I think we need to have some kind of ways to specify how to display those controls.

We already have the controls slot in the <Variant> 🤔

@hugoattal
Copy link
Collaborator

hugoattal commented Mar 17, 2022

We already have the controls slot in the <Variant> 🤔

Yes, of course, but I was thinking about a way to do it "programmatically" (I mean, in JS and not directly in the template)

The advantage being that:

  • the design of that part would be a bit more consistent, in compare to giving "too much" freedom to the user. For example, we could have two resizable columns with one being the name of the options, and the other being the control.
  • you could automatically infer the controls of the ones which has not been specified (I believe that if we relied exclusively on templates, we could not know which options are already set up, and which ones aren't)

But it's true that we could do only the components to be placed in the controls slot for now

@alvarosabu
Copy link
Contributor

Hey there, let me know if you need hands with this :)

@Akryum
Copy link
Member Author

Akryum commented May 1, 2022

@alvarosabu sure, let me do some mockups first

@Akryum
Copy link
Member Author

Akryum commented May 2, 2022

image

@Akryum
Copy link
Member Author

Akryum commented May 2, 2022

We could also have a variant of HstRadio with checkboxes, called HstMultiCheckbox

@alvarosabu
Copy link
Contributor

@Akryum sounds great. I just download the repo and create a branch and push?

@alvarosabu
Copy link
Contributor

alvarosabu commented May 2, 2022

I will take HstSelect first

  •   Select

@alvarosabu
Copy link
Contributor

alvarosabu commented May 2, 2022

So I'm basically done with the Select component. I will need access to push the branch and create the PR @Akryum when you have a chance.

Screenshot 2022-05-02 at 16 14 01

@Akryum
Copy link
Member Author

Akryum commented May 2, 2022

Done

@alvarosabu alvarosabu mentioned this issue May 2, 2022
9 tasks
@Akryum Akryum added the good first issue Good for newcomers label May 3, 2022
@alvarosabu
Copy link
Contributor

Nice, it's ok if I take next?

  • Radio list
  • Checkbox list

Cheers

@Akryum
Copy link
Member Author

Akryum commented May 3, 2022

Sure!

@alvarosabu
Copy link
Contributor

@Akryum I have one question regarding the radio list, I see you implemented the HstCheckbox width SVGs and no input element (faked with a div). Is there a specific reason to not use native input tags?.

Is the radio component expected to be implemented in the same way or I can use input + label and just hide the input visibility?

Thanks

@Akryum
Copy link
Member Author

Akryum commented May 6, 2022

I find it cleaner

@hugoattal
Copy link
Collaborator

I'll tackle those 3:

@hugoattal hugoattal self-assigned this Jun 4, 2022
@Akryum
Copy link
Member Author

Akryum commented Jun 4, 2022

Date/hour (should I use native controls or build something custom for this one?)

I think mobile native inputs are great, but desktop ones probably deserve a custom implementation because how awful they are.

Akryum added a commit that referenced this issue Jun 6, 2022
Co-authored-by: Guillaume Chau <guillaume.b.chau@gmail.com>
@alvarosabu alvarosabu self-assigned this Jun 23, 2022
@victorlmneves
Copy link

If I may suggest I think the next one should be JSON code editor since for now the auto-props don't show the initial data and we also aren't able to specify the type of input, then we need to use the controls template. That way we could use the new feature that allows us to hide the auto-props avoiding displaying the same stuff twice.
Thanks

Akryum pushed a commit that referenced this issue Oct 4, 2022
Co-authored-by: Guillaume Chau <guillaume.b.chau@gmail.com>

Related to #30
@Akryum Akryum mentioned this issue Oct 4, 2022
4 tasks
@hugoattal
Copy link
Collaborator

I'm tackling the JSON code editor!

@hugoattal hugoattal mentioned this issue Oct 8, 2022
4 tasks
Akryum pushed a commit that referenced this issue Oct 9, 2022
Co-authored-by: Guillaume Chau <guillaume.b.chau@gmail.com>

Related to #30
@MikhaD
Copy link

MikhaD commented Mar 29, 2023

I'll tackle those 3:

* Slider

* Date/hour (should I use native controls or build something custom for this one?)
  
  * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/date
  * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/time

* Color picker

I have noticed that the Slider component does not define a step prop, despite the slider story passing one in. I wasn't sure whether I should create a new issue about it.

@hugoattal
Copy link
Collaborator

@MikhaD The step property is indeed not defined in the component. So it's available in the $attrs, which is directly passed to the input HTML element like this:

<input
  v-bind="{ ...$attrs, class: null, style: null, min, max }"
>

(The class: null, style: null is to remove any class of style set, as it's already added to the HstSlider root element)

Hope it answers your concerns 🙂

@MikhaD
Copy link

MikhaD commented Mar 31, 2023

I appreciate the response.

I use Histoire for Svelte, not Vue, so unfortunately the solution does not apply.

I have a work around for now, my question is is there a reason that step is not defined or is an oversight that should be placed in a bug report.

@hugoattal
Copy link
Collaborator

The absence of the step prop was intended at the time of building the component, since it was not needed.

But if it can't be used in svelte, that's indeed a bug.

Out of curiosity, what workaround have you found?

@MikhaD
Copy link

MikhaD commented Mar 31, 2023

I made my own identical looking svelte component with a range prop that I use instead. It is not quite as good, because it doesn't have the tooltip.

Why do you say step was not needed?

@hugoattal
Copy link
Collaborator

Why do you say step was not needed?

IIRC, I built that feature when Histoire didn't support Svelte yet. So the step prop worked anyway. I'll have to take a closer look to fix it for Svelte 🙂

Akryum added a commit that referenced this issue Aug 13, 2023
Co-authored-by: Guillaume Chau <guillaume.b.chau@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request good first issue Good for newcomers in progress need spec Need Specs, UX or UI design...
Projects
None yet
Development

No branches or pull requests

5 participants