@1024pix/pix-ui 17.0.0 → 17.2.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # Pix-UI Changelog
2
2
 
3
+ ## v17.2.1 (31/08/2022)
4
+
5
+
6
+ ### :rocket: Amélioration
7
+ - [#247](https://github.com/1024pix/pix-ui/pull/247) [FEATURE] Amélioration couleurs `PixIconButton`
8
+
9
+ ## v17.2.0 (24/08/2022)
10
+
11
+
12
+ ### :rocket: Amélioration
13
+ - [#245](https://github.com/1024pix/pix-ui/pull/245) [FEATURE] Ajouter un composant Sidebar (PIX-4298)
14
+
15
+ ## v17.1.0 (22/08/2022)
16
+
17
+
18
+ ### :rocket: Amélioration
19
+ - [#243](https://github.com/1024pix/pix-ui/pull/243) [FEATURE] Ajout d'un icone pour fermer Pix-Banner (PIX-5379)
20
+ - [#244](https://github.com/1024pix/pix-ui/pull/244) [FEATURE] PixModal : ajouter des modifiers trap-focus et action au echap (PIX-5157)
21
+
3
22
  ## v17.0.0 (09/08/2022)
4
23
 
5
24
 
@@ -1,16 +1,33 @@
1
- <div class="pix-banner pix-banner--{{this.type}}" ...attributes>
2
- <FaIcon @icon={{this.icon}} class="pix-banner__icon" />
3
- <div>
4
- {{yield}}
5
- {{#if this.displayAction}}
6
- {{#if this.isExternalLink}}
7
- <a class="pix-banner__action" href={{@actionUrl}} target="_blank" rel="noopener noreferrer">
8
- {{@actionLabel}}
9
- <FaIcon class="external-link" @icon="up-right-from-square" />
10
- </a>
11
- {{else}}
12
- <LinkTo class="pix-banner__action" @route={{@actionUrl}}>{{@actionLabel}}</LinkTo>
1
+ {{#if this.displayBanner}}
2
+ <div class="pix-banner pix-banner--{{this.type}}" role="alert" ...attributes>
3
+ <FaIcon @icon={{this.icon}} class="pix-banner__icon" />
4
+ <div>
5
+ {{yield}}
6
+ {{#if this.displayAction}}
7
+ {{#if this.isExternalLink}}
8
+ <a
9
+ class="pix-banner__action"
10
+ href={{@actionUrl}}
11
+ target="_blank"
12
+ rel="noopener noreferrer"
13
+ >
14
+ {{@actionLabel}}
15
+ <FaIcon class="external-link" @icon="up-right-from-square" />
16
+ </a>
17
+ {{else}}
18
+ <LinkTo class="pix-banner__action" @route={{@actionUrl}}>{{@actionLabel}}</LinkTo>
19
+ {{/if}}
13
20
  {{/if}}
21
+ </div>
22
+ {{#if this.canCloseBanner}}
23
+ <div class="pix-banner__close">
24
+ <PixIconButton
25
+ @ariaLabel="Fermer"
26
+ @icon="xmark"
27
+ @size="small"
28
+ @triggerAction={{this.closeBanner}}
29
+ />
30
+ </div>
14
31
  {{/if}}
15
32
  </div>
16
- </div>
33
+ {{/if}}
@@ -1,4 +1,6 @@
1
1
  import Component from '@glimmer/component';
2
+ import { tracked } from '@glimmer/tracking';
3
+ import { action } from '@ember/object';
2
4
  const TYPE_INFO = 'information';
3
5
  const TYPE_ERROR = 'error';
4
6
  const TYPE_WARNING = 'warning';
@@ -25,6 +27,7 @@ const icons = {
25
27
  };
26
28
 
27
29
  export default class PixBanner extends Component {
30
+ @tracked isBannerVisible = true;
28
31
  get type() {
29
32
  return types.includes(this.args.type) ? this.args.type : TYPE_INFO;
30
33
  }
@@ -40,4 +43,17 @@ export default class PixBanner extends Component {
40
43
  get isExternalLink() {
41
44
  return this.args.actionUrl.includes('/');
42
45
  }
46
+
47
+ get canCloseBanner() {
48
+ return this.args.canCloseBanner;
49
+ }
50
+
51
+ get displayBanner() {
52
+ return this.isBannerVisible;
53
+ }
54
+
55
+ @action
56
+ closeBanner() {
57
+ this.isBannerVisible = false;
58
+ }
43
59
  }
@@ -1,17 +1,23 @@
1
- <div class="pix-modal__overlay">
1
+ <div
2
+ class="pix-modal__overlay"
3
+ {{on "click" this.closeAction}}
4
+ {{trap-focus}}
5
+ {{on-escape-action this.closeAction}}
6
+ >
2
7
  <div
3
8
  class="pix-modal"
4
9
  role="dialog"
5
10
  aria-labelledby="modal-title"
6
11
  aria-describedby="modal-content"
7
12
  aria-modal="true"
13
+ {{on "click" this.stopPropagation}}
8
14
  ...attributes
9
15
  >
10
16
  <header class="pix-modal__header">
11
17
  <h1 id="modal-title" class="pix-modal__title">{{@title}}</h1>
12
18
  <PixIconButton
13
19
  @icon="xmark"
14
- @triggerAction={{@onCloseButtonClick}}
20
+ @triggerAction={{this.closeAction}}
15
21
  @ariaLabel="Fermer"
16
22
  @size="small"
17
23
  @withBackground={{true}}
@@ -1,4 +1,5 @@
1
1
  import Component from '@glimmer/component';
2
+ import { action } from '@ember/object';
2
3
 
3
4
  export default class PixModal extends Component {
4
5
  constructor(...args) {
@@ -8,4 +9,16 @@ export default class PixModal extends Component {
8
9
  throw new Error('ERROR in PixModal component: @title argument is required.');
9
10
  }
10
11
  }
12
+
13
+ @action
14
+ stopPropagation(event) {
15
+ event.stopPropagation();
16
+ }
17
+
18
+ @action
19
+ closeAction(params) {
20
+ if (this.args.onCloseButtonClick) {
21
+ this.args.onCloseButtonClick(params);
22
+ }
23
+ }
11
24
  }
@@ -0,0 +1,34 @@
1
+ <div
2
+ class="pix-sidebar__overlay {{unless @showSidebar ' pix-sidebar__overlay--hidden'}}"
3
+ {{on "click" this.closeAction}}
4
+ {{trap-focus}}
5
+ {{on-escape-action this.closeAction}}
6
+ >
7
+ <div
8
+ class="pix-sidebar {{unless @showSidebar ' pix-sidebar--hidden'}}"
9
+ role="dialog"
10
+ aria-labelledby="sidebar-title"
11
+ aria-describedby="sidebar-content"
12
+ aria-modal="true"
13
+ {{on "click" this.stopPropagation}}
14
+ ...attributes
15
+ >
16
+ <header class="pix-sidebar__header">
17
+ <h1 id="sidebar-title" class="pix-sidebar__title">{{@title}}</h1>
18
+ <PixIconButton
19
+ @icon="xmark"
20
+ @triggerAction={{this.closeAction}}
21
+ @ariaLabel="Fermer"
22
+ @size="small"
23
+ @withBackground={{true}}
24
+ class="pix-sidebar__close-button"
25
+ />
26
+ </header>
27
+ <main id="sidebar-content" class="pix-sidebar__content">
28
+ {{yield to="content"}}
29
+ </main>
30
+ <footer class="pix-sidebar__footer">
31
+ {{yield to="footer"}}
32
+ </footer>
33
+ </div>
34
+ </div>
@@ -0,0 +1,24 @@
1
+ import Component from '@glimmer/component';
2
+ import { action } from '@ember/object';
3
+
4
+ export default class PixSidebar extends Component {
5
+ constructor(...args) {
6
+ super(...args);
7
+
8
+ if (!this.args.title) {
9
+ throw new Error('ERROR in PixSidebar component: @title argument is required.');
10
+ }
11
+ }
12
+
13
+ @action
14
+ stopPropagation(event) {
15
+ event.stopPropagation();
16
+ }
17
+
18
+ @action
19
+ closeAction(params) {
20
+ if (this.args.onClose) {
21
+ this.args.onClose(params);
22
+ }
23
+ }
24
+ }
@@ -2,52 +2,73 @@
2
2
  @import 'reset-css';
3
3
  font-family: $font-roboto;
4
4
  font-weight: $font-normal;
5
- padding: 10px 16px;
5
+ padding: 16px 24px;
6
6
  display: flex;
7
7
  align-items: center;
8
- font-size: 0.75rem;
9
-
10
- @include device-is('tablet') {
11
- padding: 20px 60px;
12
- font-size: 0.875rem;
13
- }
8
+ font-size: 0.875rem;
9
+ box-shadow: 0px 4px 8px rgba(7, 20, 46, 0.08);
14
10
 
15
11
  &__action {
16
12
  text-decoration: underline;
17
- letter-spacing: 0.028rem;
18
13
  color: inherit;
19
14
  .external-link {
20
- margin-left: 3px;
21
- font-size: 0.75rem;
22
-
23
- @include device-is('tablet') {
24
- font-size: 0.875rem;
25
- }
15
+ margin-left: 4px;
16
+ font-size: 0.875rem;
26
17
  }
27
18
  }
28
-
19
+ &__close {
20
+ display: flex;
21
+ margin-left: auto;
22
+ padding-left: 8px;
23
+ }
29
24
  &__icon {
30
- font-size: 0.875rem;
25
+ font-size: 1.125rem;
31
26
  margin-right: $spacing-xs;
32
-
33
- @include device-is('tablet') {
34
- font-size: 1rem;
35
- }
36
27
  }
37
28
 
38
29
  &--information {
39
30
  background-color: $pix-primary-5;
40
31
  color: $pix-primary-70;
32
+ .pix-icon-button {
33
+ background-color: $pix-primary-5;
34
+ color: $pix-primary-70;
35
+ &:hover:enabled,
36
+ &:focus:enabled,
37
+ &:active:enabled {
38
+ background-color: $pix-primary-10;
39
+ color: $pix-primary-70;
40
+ }
41
+ }
41
42
  }
42
43
 
43
44
  &--warning {
44
45
  background-color: $pix-warning-5;
45
46
  color: $pix-warning-70;
47
+ .pix-icon-button {
48
+ background-color: $pix-warning-5;
49
+ color: $pix-warning-70;
50
+ &:hover:enabled,
51
+ &:focus:enabled,
52
+ &:active:enabled {
53
+ background-color: $pix-warning-10;
54
+ color: $pix-warning-70;
55
+ }
56
+ }
46
57
  }
47
58
 
48
59
  &--error {
49
60
  background-color: $pix-error-5;
50
61
  color: $pix-error-70;
62
+ .pix-icon-button {
63
+ background-color: $pix-error-5;
64
+ color: $pix-error-70;
65
+ &:hover:enabled,
66
+ &:focus:enabled,
67
+ &:active:enabled {
68
+ background-color: $pix-error-10;
69
+ color: $pix-error-70;
70
+ }
71
+ }
51
72
  }
52
73
 
53
74
  &--communication {
@@ -10,35 +10,36 @@
10
10
  align-items: center;
11
11
  justify-content: center;
12
12
  background-color: transparent;
13
+ color: $pix-neutral-60;
13
14
 
14
15
  &:disabled {
15
16
  opacity: 0.5;
16
- cursor: default;
17
+ cursor: not-allowed;
17
18
  }
18
19
 
19
- &:hover,
20
- &:focus {
21
- transition: background-color 0.2s ease;
22
- background-color: $pix-neutral-15;
23
- &:disabled {
24
- background-color: transparent;
25
- }
20
+ &:hover:enabled {
21
+ background-color: $pix-neutral-20;
22
+ box-shadow: none;
23
+ border: 0;
24
+ color: $pix-neutral-60;
26
25
  }
27
26
 
28
- &:active {
29
- transition: background-color 0.2s ease;
30
- background-color: $pix-neutral-20;
27
+ &:focus:enabled {
28
+ background-color: $pix-neutral-60;
29
+ box-shadow: 0 0 0 2px $pix-neutral-60;
30
+ border: 2px solid $pix-neutral-0;
31
+ color: $pix-neutral-0;
32
+ }
33
+
34
+ &:active:enabled {
35
+ background-color: $pix-neutral-22;
36
+ box-shadow: none;
37
+ border: 0;
38
+ color: $pix-neutral-60;
31
39
  }
32
40
 
33
41
  &--background {
34
42
  background-color: $pix-neutral-10;
35
- &:hover,
36
- &:focus,
37
- &:active {
38
- &:disabled {
39
- background-color: $pix-neutral-15;
40
- }
41
- }
42
43
  }
43
44
 
44
45
  &--small {
@@ -52,12 +53,4 @@
52
53
  height: 38px;
53
54
  font-size: 1.25rem;
54
55
  }
55
-
56
- &--dark-grey {
57
- color: $pix-neutral-60;
58
- }
59
-
60
- &--light-grey {
61
- color: $pix-neutral-60;
62
- }
63
56
  }
@@ -0,0 +1,80 @@
1
+ .pix-sidebar__overlay {
2
+ position: fixed;
3
+ z-index: 1000;
4
+ top: 0;
5
+ bottom: 0;
6
+ left: 0;
7
+ right: 0;
8
+ overflow-y: scroll;
9
+ background-color: rgba(52, 69, 99, 0.7);
10
+ transition: all .3s ease-in-out;
11
+
12
+ &--hidden {
13
+ visibility: hidden;
14
+ opacity: 0;
15
+ }
16
+ }
17
+
18
+ $sidebar-padding: 16px;
19
+ $mobile-close-button-size: 32px;
20
+ $tablet-close-button-size: 40px;
21
+ $space-between-title-and-close-button: 8px;
22
+ $button-margin: 16px;
23
+
24
+ .pix-sidebar {
25
+ @import 'reset-css';
26
+ display: flex;
27
+ flex-direction: column;
28
+ height: 100%;
29
+ max-width: 320px;
30
+ box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.1);
31
+ background: $pix-neutral-0;
32
+ transform: translate(0);
33
+ transition: transform .3s ease-in-out;
34
+
35
+ &--hidden {
36
+ transform: translate(-100%);
37
+ }
38
+
39
+ &__header {
40
+ border-bottom: 1px solid $pix-neutral-20;
41
+ padding: $sidebar-padding;
42
+ display: flex;
43
+ align-items: center;
44
+ justify-content: space-between;
45
+ }
46
+
47
+ &__close-button {
48
+ flex-shrink: 0;
49
+
50
+ @include device-is('tablet') {
51
+ height: $tablet-close-button-size;
52
+ width: $tablet-close-button-size;
53
+ }
54
+ }
55
+
56
+ &__content {
57
+ flex-grow: 1;
58
+ overflow: auto;
59
+ }
60
+
61
+ &__title {
62
+ @include h4;
63
+ margin-bottom: 0;
64
+ color: $pix-neutral-90;
65
+ padding-right: $mobile-close-button-size + $space-between-title-and-close-button;
66
+
67
+ @include device-is('tablet') {
68
+ padding-right: $tablet-close-button-size + $space-between-title-and-close-button;
69
+ }
70
+ }
71
+
72
+ &__content {
73
+ padding: $sidebar-padding 0;
74
+ }
75
+
76
+ &__footer {
77
+ padding: $sidebar-padding;
78
+ border-top: 1px solid $pix-neutral-20;
79
+ }
80
+ }
@@ -22,6 +22,7 @@
22
22
  @import 'pix-input-password';
23
23
  @import 'pix-radio-button';
24
24
  @import 'pix-modal';
25
+ @import 'pix-sidebar';
25
26
  @import 'pix-input-code';
26
27
  @import 'pix-selectable-tag';
27
28
  @import 'pix-dropdown';
@@ -0,0 +1 @@
1
+ export { default } from '@1024pix/pix-ui/components/pix-sidebar';
@@ -0,0 +1,19 @@
1
+ import { modifier } from 'ember-modifier';
2
+
3
+ export default modifier((element, [callback]) => {
4
+ function handleKeyUp(event) {
5
+ const TAB_KEY = 'Escape';
6
+
7
+ if (event.key !== TAB_KEY) {
8
+ return;
9
+ }
10
+
11
+ callback(event);
12
+ }
13
+
14
+ element.addEventListener('keyup', handleKeyUp);
15
+
16
+ return () => {
17
+ element.removeEventListener('keyup', handleKeyUp);
18
+ };
19
+ });
@@ -0,0 +1,52 @@
1
+ import { modifier } from 'ember-modifier';
2
+
3
+ export default modifier(function trapFocus(element) {
4
+ const [firstFocusableElement] = findFocusableElements(element);
5
+
6
+ firstFocusableElement.focus();
7
+
8
+ function handleKeyDown(event) {
9
+ const TAB_KEY = 9;
10
+ const focusableElements = findFocusableElements(element);
11
+ const [firstFocusableElement] = focusableElements;
12
+ const lastFocusableElement = focusableElements[focusableElements.length - 1];
13
+
14
+ if (event.keyCode !== TAB_KEY) {
15
+ return;
16
+ }
17
+
18
+ function handleBackwardTab() {
19
+ if (document.activeElement === firstFocusableElement) {
20
+ event.preventDefault();
21
+ lastFocusableElement.focus();
22
+ }
23
+ }
24
+
25
+ function handleForwardTab() {
26
+ if (document.activeElement === lastFocusableElement) {
27
+ event.preventDefault();
28
+ firstFocusableElement.focus();
29
+ }
30
+ }
31
+
32
+ if (event.shiftKey) {
33
+ handleBackwardTab();
34
+ } else {
35
+ handleForwardTab();
36
+ }
37
+ }
38
+
39
+ element.addEventListener('keydown', handleKeyDown);
40
+
41
+ return () => {
42
+ element.removeEventListener('keydown', handleKeyDown);
43
+ };
44
+ });
45
+
46
+ function findFocusableElements(element) {
47
+ return [
48
+ ...element.querySelectorAll(
49
+ 'a[href], button, input, textarea, select, details,[tabindex]:not([tabindex="-1"])'
50
+ ),
51
+ ].filter((el) => !el.hasAttribute('disabled') && !el.getAttribute('aria-hidden'));
52
+ }
@@ -7,6 +7,7 @@ const Template = (args) => {
7
7
  @type={{type}}
8
8
  @actionLabel={{actionLabel}}
9
9
  @actionUrl={{actionUrl}}
10
+ @canCloseBanner={{canCloseBanner}}
10
11
  >
11
12
  Parcours de rentrée 2020 : les codes sont disponibles dans l'onglet campagne. N’oubliez pas de les diffuser aux élèves avant la Toussaint.
12
13
  </PixBanner>
@@ -56,6 +57,12 @@ withInternalLink.args = {
56
57
  actionUrl: 'campaign.list',
57
58
  };
58
59
 
60
+ export const withCloseIcon = Template.bind({});
61
+ withCloseIcon.args = {
62
+ type: 'info',
63
+ canCloseBanner: true,
64
+ };
65
+
59
66
  export const argsTypes = {
60
67
  actionLabel: {
61
68
  name: 'actionLabel',
@@ -86,4 +93,13 @@ export const argsTypes = {
86
93
  ],
87
94
  },
88
95
  },
96
+ canCloseBanner: {
97
+ name: 'canCloseBanner',
98
+ description: 'Afficher la croix pour fermer la bannière',
99
+ type: { name: 'boolean', required: false },
100
+ table: {
101
+ type: { summary: 'boolean' },
102
+ defaultValue: { summary: false },
103
+ },
104
+ },
89
105
  };
@@ -67,6 +67,14 @@ Bannière contenant un lien externe.
67
67
  <Story name="With external link" story={stories.withExternalLink} height={100} />
68
68
  </Canvas>
69
69
 
70
+ ## With Close Icon
71
+
72
+ Bannière contenant un bouton qui permet de fermer la bannière.
73
+
74
+ <Canvas>
75
+ <Story name="With close icon" story={stories.withCloseIcon} height={100} />
76
+ </Canvas>
77
+
70
78
  ## Usage
71
79
 
72
80
  ```html
@@ -100,6 +108,13 @@ Bannière Info par défaut
100
108
  Bannière avec une route externe
101
109
  </PixBanner>
102
110
 
111
+ <PixBanner
112
+ @type='warning'
113
+ @canCloseBanner=true
114
+ >
115
+ Bannière posséndant un bouton de fermeture
116
+ </PixBanner>
117
+
103
118
  ```
104
119
 
105
120
  ## Arguments
@@ -11,31 +11,42 @@ const Template = (args) => {
11
11
  @triggerAction={{triggerAction}}
12
12
  @withBackground={{withBackground}}
13
13
  @size={{size}}
14
+ disabled={{disabled}}
15
+ aria-disabled={{disabled}}
14
16
  />
15
17
  `,
16
18
  context: args,
17
19
  };
18
20
  };
19
21
 
22
+ const triggerAction = () => Promise.resolve();
23
+
20
24
  export const Default = Template.bind({});
21
25
  Default.args = {
22
26
  ariaLabel: 'Action du bouton',
23
27
  icon: 'xmark',
24
- triggerAction: () => {
25
- return new Promise().resolves();
26
- },
28
+ triggerAction,
27
29
  };
28
30
 
29
31
  export const small = Template.bind({});
30
32
  small.args = {
31
33
  ...Default.args,
32
34
  size: 'small',
35
+ triggerAction,
33
36
  };
34
37
 
35
38
  export const withBackground = Template.bind({});
36
39
  withBackground.args = {
37
40
  ...Default.args,
38
41
  withBackground: true,
42
+ triggerAction,
43
+ };
44
+
45
+ export const disabled = Template.bind({});
46
+ disabled.args = {
47
+ ...Default.args,
48
+ disabled: true,
49
+ triggerAction,
39
50
  };
40
51
 
41
52
  export const argTypes = {
@@ -3,8 +3,8 @@ import centered from '@storybook/addon-centered/ember';
3
3
  import * as stories from './pix-icon-button.stories.js';
4
4
 
5
5
  <Meta
6
- title='Basics/Icon button'
7
- component='PixIconButton'
6
+ title="Basics/Icon button"
7
+ component="PixIconButton"
8
8
  decorators={[centered]}
9
9
  argTypes={stories.argTypes}
10
10
  />
@@ -37,6 +37,14 @@ Le bouton avec le fond grisé.
37
37
  <Story name="With Background" story={stories.withBackground} height={60} />
38
38
  </Canvas>
39
39
 
40
+ ## Disabled
41
+
42
+ Exemple avec le bouton disabled
43
+
44
+ <Canvas>
45
+ <Story name="Disabled" story={stories.disabled} height={60} />
46
+ </Canvas>
47
+
40
48
  ## Accessibilité / aria-label
41
49
 
42
50
  L'attribut `aria-label` étant indispensable pour l'accessibilité de ce composant, la propriété `ariaLabel` a été ajouté.
@@ -48,42 +56,42 @@ L'attribut `aria-label` étant indispensable pour l'accessibilité de ce composa
48
56
  ## Usage
49
57
 
50
58
  Par défaut
59
+
51
60
  ```html
52
- <PixIconButton
53
- @ariaLabel="L'action du bouton"
54
- @icon="icon"
55
- @triggerAction={{triggerAction}}
56
- />
61
+ <PixIconButton @ariaLabel="L'action du bouton" @icon="icon" @triggerAction="{{triggerAction}}" />
57
62
  ```
58
63
 
59
64
  Bouton de fermeture
65
+
60
66
  ```html
61
67
  <PixIconButton
62
- @ariaLabel="L'action du bouton"
63
- @icon="times"
64
- @triggerAction={{triggerAction}}
65
- @withBackground={{true}}
68
+ @ariaLabel="L'action du bouton"
69
+ @icon="times"
70
+ @triggerAction="{{triggerAction}}"
71
+ @withBackground="{{true}}"
66
72
  />
67
73
  ```
68
74
 
69
75
  Bouton d'action
76
+
70
77
  ```html
71
78
  <PixIconButton
72
- @ariaLabel="L'action du bouton"
73
- @icon="arrow-left"
74
- @triggerAction={{triggerAction}}
75
- @size="small"
76
- @withBackground={{true}}
79
+ @ariaLabel="L'action du bouton"
80
+ @icon="arrow-left"
81
+ @triggerAction="{{triggerAction}}"
82
+ @size="small"
83
+ @withBackground="{{true}}"
77
84
  />
78
85
  ```
79
86
 
80
87
  État disabled
88
+
81
89
  ```html
82
90
  <PixIconButton
83
- @ariaLabel="L'action du bouton"
84
- @icon="xmark"
85
- disabled={{true}}
86
- aria-disabled={{true}}
91
+ @ariaLabel="L'action du bouton"
92
+ @icon="xmark"
93
+ disabled="{{true}}"
94
+ aria-disabled="{{true}}"
87
95
  />
88
96
  ```
89
97
 
@@ -1,9 +1,9 @@
1
1
  import { hbs } from 'ember-cli-htmlbars';
2
2
 
3
- export const modal = (args) => {
3
+ export const Template = (args) => {
4
4
  return {
5
5
  template: hbs`
6
- <PixModal @title={{this.title}}>
6
+ <PixModal @title={{this.title}} @onCloseButtonClick={{onCloseButtonClick}}>
7
7
  <:content>
8
8
  <p>
9
9
  Une fenêtre modale est, dans une interface graphique, une fenêtre qui prend le contrôle total du clavier et
@@ -24,16 +24,24 @@ export const modal = (args) => {
24
24
  };
25
25
  };
26
26
 
27
+ export const Default = Template.bind({});
28
+ Default.args = {
29
+ title: "Qu'est-ce qu'une modale ?",
30
+ onCloseButtonClick: () => {
31
+ alert('Action : fermer modale');
32
+ },
33
+ };
34
+
27
35
  export const argTypes = {
28
36
  title: {
29
37
  name: 'title',
30
38
  description: 'Titre de la modale',
31
- type: { name: 'string', required: false },
32
- defaultValue: "Qu'est-ce qu'une modale ?",
39
+ type: { name: 'string', required: true },
40
+ defaultValue: null,
33
41
  },
34
42
  onCloseButtonClick: {
35
43
  name: 'onCloseButtonClick',
36
- description: 'Fonction à executer lors du clic sur le bouton de fermeture de la modale',
44
+ description: 'Fonction à exécuter à la fermeture de la modale',
37
45
  type: { name: 'function', required: true },
38
46
  defaultValue: null,
39
47
  },
@@ -4,8 +4,8 @@ import centered from '@storybook/addon-centered/ember';
4
4
  import * as stories from './pix-modal.stories.js';
5
5
 
6
6
  <Meta
7
- title='Basics/Modal'
8
- component='PixModal'
7
+ title="Basics/Modal"
8
+ component="PixModal"
9
9
  decorators={[centered]}
10
10
  argTypes={stories.argTypes}
11
11
  />
@@ -15,13 +15,14 @@ import * as stories from './pix-modal.stories.js';
15
15
  Une fenêtre modale responsive et scrollable avec un overlay.
16
16
 
17
17
  Ce composant possède deux `yield` :
18
+
18
19
  - `:content` est destiné à accueillir le contenu principal de la fenêtre modale. Il peut accueillir tout type de
19
20
  contenu HTML (simple texte, image, formulaire, etc.)
20
21
  - `:footer` peut également accueillir tout type de contenu HTML, mais est destiné aux boutons permettant d'interagir
21
22
  avec la modale, ce qui permettra de les positionner correctement dans tous les cas de figure.
22
23
 
23
24
  <Canvas>
24
- <Story name='PixModal' story={stories.modal} height={500} />
25
+ <Story name="Default" story={stories.Default} height={500} />
25
26
  </Canvas>
26
27
 
27
28
  ## Usage
@@ -0,0 +1,61 @@
1
+ import { hbs } from 'ember-cli-htmlbars';
2
+
3
+ export const Template = (args) => {
4
+ return {
5
+ template: hbs`
6
+ <PixButton @triggerAction={{fn (mut showSidebar) (not showSidebar)}}>Ouvrir la sidebar</PixButton>
7
+ <PixSidebar @showSidebar={{showSidebar}} @title={{title}} @onClose={{fn (mut showSidebar) (not showSidebar)}}>
8
+ <:content>
9
+ <p>
10
+ Une sidebar est, dans une interface graphique, une fenêtre qui prend le contrôle total du clavier et
11
+ de l'écran. Elle est en général associée à du paramétrage d'écran.
12
+ </p>
13
+ </:content>
14
+ <:footer>
15
+ <div style="display: flex; gap: 8px">
16
+ <PixButton @backgroundColor="transparent-light" @isBorderVisible="true">Annuler</PixButton>
17
+ <PixButton>Valider</PixButton>
18
+ </div>
19
+ </:footer>
20
+ </PixSidebar>
21
+ `,
22
+ context: args,
23
+ };
24
+ };
25
+
26
+ export const Default = Template.bind({});
27
+ Default.args = {
28
+ showSidebar: true,
29
+ title: 'Filtrer',
30
+ onClose: () => {},
31
+ };
32
+
33
+ export const argTypes = {
34
+ showSidebar: {
35
+ name: 'showSidebar',
36
+ description: 'Visibilité de la sidebar',
37
+ type: { name: 'boolean', required: false },
38
+ control: { type: 'boolean' },
39
+ table: {
40
+ type: { summary: 'boolean' },
41
+ defaultValue: { summary: false },
42
+ },
43
+ },
44
+ title: {
45
+ name: 'title',
46
+ description: 'Titre de la sidebar',
47
+ type: { name: 'string', required: true },
48
+ table: {
49
+ type: { summary: 'string' },
50
+ defaultValue: { summary: '' },
51
+ },
52
+ },
53
+ onClose: {
54
+ name: 'onClose',
55
+ description: 'Fonction à exécuter à la fermeture de la sidebar',
56
+ type: { name: 'function', required: true },
57
+ table: {
58
+ type: { summary: 'function' },
59
+ },
60
+ },
61
+ };
@@ -0,0 +1,57 @@
1
+ import { Meta, Story, Canvas, ArgsTable } from '@storybook/addon-docs/blocks';
2
+ import centered from '@storybook/addon-centered/ember';
3
+
4
+ import * as stories from './pix-sidebar.stories.js';
5
+
6
+ <Meta
7
+ title="Basics/Sidebar"
8
+ component="PixSidebar"
9
+ decorators={[centered]}
10
+ argTypes={stories.argTypes}
11
+ />
12
+
13
+ # PixSidebar
14
+
15
+ Une sidebar responsive et scrollable avec un overlay.
16
+
17
+ Ce composant possède deux `yield` :
18
+
19
+ - `:content` est destiné à accueillir le contenu principal de la fenêtre sidebar. Il peut accueillir tout type de
20
+ contenu HTML (simple texte, image, formulaire, etc.)
21
+ - `:footer` peut également accueillir tout type de contenu HTML, mais est destiné aux boutons permettant d'interagir
22
+ avec la sidebar, ce qui permettra de les positionner correctement dans tous les cas de figure.
23
+
24
+ <Canvas>
25
+ <Story name="Default" story={stories.Default} height={500} />
26
+ </Canvas>
27
+
28
+ ## Usage
29
+
30
+ ```html
31
+ <PixSidebar
32
+ @showSidebar={{true}}
33
+ @title="Filtrer"
34
+ @onClose={{this.closeSidebar}}
35
+ >
36
+ <:content>
37
+ <p>
38
+ Une sidebar est, dans une interface graphique, une fenêtre qui prend le contrôle total du clavier et
39
+ de l'écran. Elle est en général associée à du paramétrage d'écran.
40
+ </p>
41
+ </:content>
42
+ <:footer>
43
+ <PixButton
44
+ @backgroundColor="transparent-light"
45
+ @isBorderVisible={{true}}
46
+ @triggerAction={{this.closeSidebar}}
47
+ >
48
+ Annuler
49
+ </PixButton>
50
+ <PixButton>Valider</PixButton>
51
+ </:footer>
52
+ </PixSidebar>
53
+ ```
54
+
55
+ ## Arguments
56
+
57
+ <ArgsTable story="Default" />
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@1024pix/pix-ui",
3
- "version": "17.0.0",
3
+ "version": "17.2.1",
4
4
  "description": "Pix-UI is the implementation of Pix design principles and guidelines for its products.",
5
5
  "keywords": [
6
6
  "ember-addon"