@digigov/ui 2.0.0-a402a664 → 2.0.0-aa380ec7

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.
Files changed (144) hide show
  1. package/app/Loader/Loader.stories.d.ts +45 -1
  2. package/app/Loader/__stories__/AccessibilityLoader.d.ts +3 -0
  3. package/app/Loader/__stories__/FullPageLoader.d.ts +1 -0
  4. package/app/Loader/__stories__/Secondary.d.ts +3 -0
  5. package/app/Loader/__stories__/Sizes.d.ts +3 -0
  6. package/app/Loader/index.native.d.ts +2 -2
  7. package/app/Loader/index.native.js.map +2 -2
  8. package/app/Loader/index.web/index.js +17 -1
  9. package/app/Loader/index.web.d.ts +19 -1
  10. package/app/Loader/index.web.js.map +3 -3
  11. package/app/Masthead/Masthead.stories.d.ts +28 -1
  12. package/app/Modal/Modal.stories.d.ts +20 -1
  13. package/app/hooks/useNotificationArea/index.js +76 -0
  14. package/app/hooks/useNotificationArea/package.json +6 -0
  15. package/app/hooks/useNotificationArea.d.ts +1 -0
  16. package/app/hooks/useNotificationArea.js.map +7 -0
  17. package/cjs/app/Loader/index.native.js.map +2 -2
  18. package/cjs/app/Loader/index.web/index.js +33 -2
  19. package/cjs/app/Loader/index.web.js.map +3 -3
  20. package/cjs/app/hooks/useNotificationArea/index.js +99 -0
  21. package/cjs/app/hooks/useNotificationArea.js.map +7 -0
  22. package/cjs/i18n/locales/el/index.js +44 -17
  23. package/cjs/i18n/locales/el.js.map +2 -2
  24. package/cjs/i18n/locales/en/index.js +33 -6
  25. package/cjs/i18n/locales/en.js.map +2 -2
  26. package/cjs/layouts/Hidden/index.js +19 -0
  27. package/cjs/layouts/Hidden/index.js.map +3 -3
  28. package/cjs/lazy.js +1 -0
  29. package/cjs/lazy.js.map +2 -2
  30. package/cjs/registry.js +14 -12
  31. package/cjs/registry.js.map +2 -2
  32. package/content/Accordion/Accordion.stories.d.ts +27 -16
  33. package/content/SummaryList/SummaryList.stories.d.ts +6 -1
  34. package/content/SummaryList/__stories__/SummaryListExample.d.ts +2 -1
  35. package/content/SummaryList/__stories__/WithError.d.ts +3 -0
  36. package/content/Table/Table.stories.d.ts +18 -6
  37. package/content/Table/__stories__/UsingHighlights.d.ts +3 -0
  38. package/feedback/NotificationBanner/NotificationBanner.stories.d.ts +14 -13
  39. package/feedback/NotificationBanner/__stories__/Expanded.d.ts +3 -0
  40. package/feedback/PhaseBanner/PhaseBanner.stories.d.ts +1 -1
  41. package/i18n/locales/el/index.js +44 -17
  42. package/i18n/locales/el.d.ts +31 -4
  43. package/i18n/locales/el.js.map +2 -2
  44. package/i18n/locales/en/index.js +33 -6
  45. package/i18n/locales/en.d.ts +31 -4
  46. package/i18n/locales/en.js.map +2 -2
  47. package/index.js +1 -1
  48. package/layouts/Grid/Grid.stories.d.ts +82 -0
  49. package/layouts/Hidden/Hidden.stories.d.ts +115 -0
  50. package/layouts/Hidden/index.d.ts +2 -0
  51. package/layouts/Hidden/index.js +5 -0
  52. package/layouts/Hidden/index.js.map +2 -2
  53. package/layouts/Stack/Stack.stories.d.ts +76 -0
  54. package/lazy/index.js +1 -0
  55. package/navigation/BackToTopLink/BackToTopLink.stories.d.ts +2 -0
  56. package/navigation/Dropdown/Dropdown.stories.d.ts +75 -1
  57. package/navigation/SkipLink/SkipLink.stories.d.ts +2 -0
  58. package/package.json +5 -5
  59. package/registry/index.js +14 -12
  60. package/src/app/BannerContainer/__stories__/CookiesBanner.tsx +1 -21
  61. package/src/app/Header/doc.mdx +3 -3
  62. package/src/app/Loader/Loader.stories.jsx +54 -0
  63. package/src/app/Loader/__stories__/AccessibilityLoader.tsx +27 -0
  64. package/src/app/Loader/__stories__/FullPageLoader.tsx +9 -5
  65. package/src/app/Loader/__stories__/Secondary.tsx +11 -0
  66. package/src/app/Loader/__stories__/Sizes.tsx +18 -0
  67. package/src/app/Loader/doc.mdx +39 -0
  68. package/src/app/Loader/index.native.tsx +2 -2
  69. package/src/app/Loader/index.test.tsx +12 -0
  70. package/src/app/Loader/index.web.tsx +39 -1
  71. package/src/app/Masthead/Masthead.stories.jsx +66 -0
  72. package/src/app/Masthead/doc.mdx +3 -3
  73. package/src/app/Modal/Modal.stories.jsx +64 -0
  74. package/src/app/Modal/__stories__/AlertDialog.tsx +1 -1
  75. package/src/app/Modal/__stories__/Auto.tsx +1 -1
  76. package/src/app/Modal/__stories__/Default.tsx +1 -1
  77. package/src/app/Modal/__stories__/Dense.tsx +1 -1
  78. package/src/app/Modal/__stories__/WithHooks.tsx +1 -1
  79. package/src/app/Modal/__stories__/WithoutModalGaps.tsx +1 -1
  80. package/src/app/hooks/useNotificationArea.tsx +105 -0
  81. package/src/content/Accordion/Accordion.stories.jsx +9 -1
  82. package/src/content/Accordion/doc.mdx +1 -2
  83. package/src/content/Card/doc.mdx +11 -11
  84. package/src/content/Chip/doc.mdx +4 -4
  85. package/src/content/List/doc.mdx +3 -3
  86. package/src/content/SummaryList/SummaryList.stories.js +7 -1
  87. package/src/content/SummaryList/__stories__/SummaryListExample.tsx +9 -2
  88. package/src/content/SummaryList/__stories__/WithError.tsx +48 -0
  89. package/src/content/SummaryList/index.test.tsx +4 -0
  90. package/src/content/Table/Table.stories.jsx +19 -2
  91. package/src/content/Table/__stories__/UsingHighlights.tsx +82 -0
  92. package/src/content/Table/index.test.tsx +4 -0
  93. package/src/content/TaskList/doc.mdx +1 -1
  94. package/src/content/Timeline/doc.mdx +1 -1
  95. package/src/feedback/CopyToClipboard/doc.mdx +1 -1
  96. package/src/feedback/ErrorSummary/doc.mdx +1 -1
  97. package/src/feedback/NotificationBanner/NotificationBanner.stories.js +10 -9
  98. package/src/feedback/NotificationBanner/__stories__/Expanded.tsx +27 -0
  99. package/src/feedback/NotificationBanner/doc.mdx +15 -6
  100. package/src/feedback/NotificationBanner/index.test.tsx +4 -0
  101. package/src/feedback/PhaseBanner/PhaseBanner.stories.jsx +1 -1
  102. package/src/form/AutoComplete/doc.mdx +2 -2
  103. package/src/form/Button/doc.mdx +25 -14
  104. package/src/form/Checkbox/doc.mdx +1 -1
  105. package/src/form/RadioContainer/doc.mdx +4 -4
  106. package/src/i18n/locales/el.ts +66 -16
  107. package/src/i18n/locales/en.ts +40 -5
  108. package/src/layouts/Basic/doc.mdx +0 -2
  109. package/src/layouts/Grid/Grid.stories.jsx +143 -0
  110. package/src/layouts/Hidden/Hidden.stories.jsx +62 -0
  111. package/src/layouts/Hidden/index.tsx +3 -0
  112. package/src/layouts/Stack/Stack.stories.jsx +104 -0
  113. package/src/lazy.js +1 -0
  114. package/src/navigation/BackToTopLink/BackToTopLink.stories.js +4 -0
  115. package/src/navigation/BackToTopLink/doc.mdx +22 -0
  116. package/src/navigation/Breadcrumbs/doc.mdx +4 -0
  117. package/src/navigation/Dropdown/Dropdown.stories.jsx +118 -0
  118. package/src/navigation/Dropdown/doc.mdx +24 -2
  119. package/src/navigation/NavList/doc.mdx +1 -1
  120. package/src/navigation/Pagination/doc.mdx +5 -1
  121. package/src/navigation/SkipLink/SkipLink.stories.js +4 -0
  122. package/src/navigation/SkipLink/doc.mdx +19 -0
  123. package/src/registry.js +14 -12
  124. package/src/typography/CodeBlock/CodeBlock.stories.js +24 -0
  125. package/src/typography/Heading/Heading.stories.js +12 -0
  126. package/src/typography/HeadingCaption/HeadingCaption.stories.js +9 -0
  127. package/src/typography/Hint/Hint.stories.js +11 -0
  128. package/src/typography/Hint/__stories__/Default.tsx +1 -1
  129. package/src/typography/Hint/__stories__/FontSizes.tsx +4 -4
  130. package/src/typography/NormalText/NormalText.stories.js +10 -0
  131. package/src/typography/Paragraph/Paragraph.stories.js +23 -0
  132. package/stories-registry/index.js +26 -12
  133. package/typography/CodeBlock/CodeBlock.stories.d.ts +11 -0
  134. package/typography/Heading/Heading.stories.d.ts +10 -0
  135. package/typography/HeadingCaption/HeadingCaption.stories.d.ts +8 -0
  136. package/typography/Hint/Hint.stories.d.ts +9 -0
  137. package/typography/NormalText/NormalText.stories.d.ts +8 -0
  138. package/typography/Paragraph/Paragraph.stories.d.ts +37 -0
  139. package/src/app/Loader/Loader.stories.js +0 -8
  140. package/src/app/Masthead/Masthead.stories.js +0 -17
  141. package/src/app/Modal/Modal.stories.js +0 -18
  142. package/src/layouts/Grid/Grid.stories.js +0 -12
  143. package/src/layouts/Stack/Stack.stories.js +0 -15
  144. package/src/navigation/Dropdown/Dropdown.stories.js +0 -23
@@ -0,0 +1,39 @@
1
+ ---
2
+ id: loader
3
+ title: Loader
4
+ ---
5
+
6
+ # Loader
7
+
8
+ Loading spinner is used for notifying users that their action is being processed or data retrieved from server.
9
+
10
+ ## How to use
11
+
12
+
13
+ <code src="@digigov/ui/app/Loader/__stories__/Default.tsx" />
14
+
15
+
16
+ ### Secondary color
17
+
18
+ <code src="@digigov/ui/app/Loader/__stories__/Secondary.tsx" />
19
+
20
+
21
+ ### Different sizes
22
+
23
+ <code src="@digigov/ui/app/Loader/__stories__/Sizes.tsx" />
24
+
25
+ ### Full page loader
26
+
27
+ <code src="@digigov/ui/app/Loader/__stories__/FullPageLoader.tsx" />
28
+
29
+
30
+ ## API
31
+
32
+ See below for a complete reference to all of the props available to the components mentioned here.
33
+
34
+ <ComponentProps componentName={[
35
+ "CircularProgress",
36
+ "Loader",
37
+ ]}
38
+ />
39
+
@@ -1,9 +1,9 @@
1
1
  import React, { useRef, useEffect } from 'react';
2
2
  import { Animated, Easing } from 'react-native';
3
3
  import Svg, { Circle } from 'react-native-svg';
4
- import { CircularProgressProps } from '@digigov/react-core/CircularProgress';
4
+ import { CircularProgressBaseProps } from '@digigov/react-core/CircularProgressBase';
5
5
 
6
- export const CircularProgress: React.FC<CircularProgressProps> = ({
6
+ export const CircularProgress: React.FC<CircularProgressBaseProps> = ({
7
7
  size = 'md',
8
8
  color = 'primary',
9
9
  }) => {
@@ -1,19 +1,31 @@
1
1
  import React from 'react';
2
2
  import { test, expect } from '@playwright/experimental-ct-react';
3
3
  import TestVariant from '@digigov/ui/utils/TestVariant'
4
+ import { AccessibilityLoader } from '@digigov/ui/app/Loader/__stories__/AccessibilityLoader';
4
5
  import { Default } from '@digigov/ui/app/Loader/__stories__/Default';
5
6
  import { FullPageLoader } from '@digigov/ui/app/Loader/__stories__/FullPageLoader';
7
+ import { Secondary } from '@digigov/ui/app/Loader/__stories__/Secondary';
8
+ import { Sizes } from '@digigov/ui/app/Loader/__stories__/Sizes';
6
9
 
7
10
  test('renders the All Loader variants', async ({ mount, page }) => {
8
11
  await mount(
9
12
 
10
13
  <div>
14
+ <TestVariant title="AccessibilityLoader">
15
+ <AccessibilityLoader />
16
+ </TestVariant>
11
17
  <TestVariant title="Default">
12
18
  <Default />
13
19
  </TestVariant>
14
20
  <TestVariant title="FullPageLoader">
15
21
  <FullPageLoader />
16
22
  </TestVariant>
23
+ <TestVariant title="Secondary">
24
+ <Secondary />
25
+ </TestVariant>
26
+ <TestVariant title="Sizes">
27
+ <Sizes />
28
+ </TestVariant>
17
29
  </div>
18
30
  )
19
31
  await page.evaluate(() => document.fonts.ready);
@@ -1 +1,39 @@
1
- export * from '@digigov/react-core/CircularProgress';
1
+ import React from 'react';
2
+ export * from '@digigov/react-core/CircularProgressBase';
3
+ import CircularProgressBase, {
4
+ CircularProgressBaseProps,
5
+ } from '@digigov/react-core/CircularProgressBase';
6
+ import { useNotificationArea } from '@digigov/ui/app/hooks/useNotificationArea';
7
+
8
+ export interface CircularProgressProps extends CircularProgressBaseProps {
9
+ /**
10
+ * loadingText prop is optional
11
+ * Text for screen readers when loading starts
12
+ * @default "Γίνεται φόρτωση..."
13
+ */
14
+ loadingText?: string;
15
+ /**
16
+ * loadingFinishedText prop is optional
17
+ * Text for screen readers when loading finishes
18
+ * @default "Η φόρτωση ολοκληρώθηκε."
19
+ */
20
+ loadingFinishedText?: string;
21
+ }
22
+
23
+ export const CircularProgress = React.forwardRef<
24
+ SVGElement,
25
+ CircularProgressProps
26
+ >(function CircularProgress(
27
+ {
28
+ loadingText = 'Γίνεται φόρτωση...',
29
+ loadingFinishedText = 'Η φόρτωση ολοκληρώθηκε.',
30
+ ...props
31
+ },
32
+ ref
33
+ ) {
34
+ useNotificationArea(loadingText, loadingFinishedText);
35
+
36
+ return <CircularProgressBase ref={ref} {...props} />;
37
+ });
38
+
39
+ export default CircularProgress;
@@ -0,0 +1,66 @@
1
+ import React from 'react';
2
+ import doc from './doc.mdx?raw';
3
+
4
+ import { Masthead, MastheadBody } from '@digigov/ui/app/Masthead';
5
+ import { CallToAction } from '@digigov/ui/form/Button/CallToAction';
6
+ import { Container } from '@digigov/ui/layouts/Basic/Container';
7
+ import { Main } from '@digigov/ui/layouts/Basic/Main';
8
+ import { Heading } from '@digigov/ui/typography/Heading';
9
+ import { Hint } from '@digigov/ui/typography/Hint';
10
+
11
+ export default {
12
+ title: 'Digigov UI/app/Masthead',
13
+ description:
14
+ 'You can use the masthead at the top of the first page of a GOV.GR service, not at internal pages.',
15
+ link: 'https://guide.services.gov.gr/docs/components/masthead',
16
+ defaultWidth: 'lg',
17
+ component: Masthead,
18
+ tags: ['autodocs'],
19
+ markdown: doc,
20
+ displayName: 'Masthead',
21
+ };
22
+
23
+ export const WithControls = {
24
+ render: (args) => {
25
+ return (
26
+ <Masthead color={args.color}>
27
+ <Container>
28
+ <Main as="div">
29
+ <Heading>Σχεδιάστε την υπηρεσία σας, με το στυλ του GOV.GR</Heading>
30
+ <MastheadBody>
31
+ Χρησιμοποιείστε αυτόν τον οδηγό ώστε να φτιάξετε μια υπηρεσία
32
+ συνεπή στα πρότυπα του GOV.GR. Αποκτήστε γνώση από την έρευνα και
33
+ την εμπειρία άλλων ομάδων και αποφύγετε την επανάληψη εργασιών που
34
+ έχουν ήδη γίνει.
35
+ </MastheadBody>
36
+ {args.showHint && <Hint>Τελευταία ενημέρωση: 08/12/2021</Hint>}
37
+ <CallToAction href="#">Ξεκινήστε εδώ</CallToAction>
38
+ </Main>
39
+ </Container>
40
+ </Masthead>
41
+ );
42
+ },
43
+ args: {
44
+ color: 'primary',
45
+ showHint: false,
46
+ },
47
+ argTypes: {
48
+ color: {
49
+ control: {
50
+ type: 'inline-radio',
51
+ },
52
+ options: ['primary', 'secondary'],
53
+ },
54
+ showHint: {
55
+ control: 'boolean',
56
+ },
57
+ },
58
+ parameters: {
59
+ controls: { exclude: ['ref'] },
60
+ },
61
+ };
62
+
63
+ export { Default } from '@digigov/ui/app/Masthead/__stories__/Default';
64
+ export { Secondary } from '@digigov/ui/app/Masthead/__stories__/Secondary';
65
+ export { WithLogo } from '@digigov/ui/app/Masthead/__stories__/WithLogo';
66
+ export { WithElements } from '@digigov/ui/app/Masthead/__stories__/WithElements';
@@ -11,15 +11,15 @@ The Masthead component is a set of features or layout that marks the page and de
11
11
 
12
12
  <code src="@digigov/ui/app/Masthead/__stories__/Default.tsx" />
13
13
 
14
- ## With secondary color
14
+ ### With secondary color
15
15
 
16
16
  <code src="@digigov/ui/app/Masthead/__stories__/Secondary.tsx" />
17
17
 
18
- ## With logo
18
+ ### With logo
19
19
 
20
20
  <code src="@digigov/ui/app/Masthead/__stories__/WithLogo.tsx" />
21
21
 
22
- ## With elements
22
+ ### With elements
23
23
 
24
24
  <code src="@digigov/ui/app/Masthead/__stories__/WithElements.tsx" />
25
25
 
@@ -0,0 +1,64 @@
1
+ import React from 'react';
2
+ import doc from './doc.mdx?raw';
3
+ import { Paragraph } from '@digigov/ui/typography/Paragraph';
4
+ import {
5
+ Modal,
6
+ ModalHeading,
7
+ ModalContent,
8
+ ModalAction,
9
+ } from '@digigov/ui/app/Modal';
10
+ import Button from '@digigov/ui/form/Button';
11
+
12
+ export default {
13
+ title: 'Digigov UI/app/Modal',
14
+ description:
15
+ 'Use the modal component with caution when you need to provide critical information or ask for a decision.',
16
+ link: 'https://guide.services.gov.gr/docs/patterns/admin-pages/components/modal',
17
+ component: Modal,
18
+ tags: ['autodocs'],
19
+ markdown: doc,
20
+ displayName: 'Modal',
21
+ };
22
+
23
+ export const WithControls = {
24
+ render: (args) => {
25
+ return (
26
+ <Modal
27
+ open={true}
28
+ aria-labelledby="modal-label"
29
+ dense={args.dense}
30
+ gaps={args.gaps}
31
+ >
32
+ <ModalHeading id="modal-label">Διαγραφή τηλεφώνου</ModalHeading>
33
+ <ModalContent>
34
+ <Paragraph mb={args.gaps ? 0 : 4}>
35
+ Είστε σίγουροι ότι θέλετε να διαγράψετε τον αριθμό τηλεφώνου; Αυτή η
36
+ ενέργεια είναι οριστική.
37
+ </Paragraph>
38
+ </ModalContent>
39
+ <ModalAction>
40
+ <Button>Διαγραφή</Button>
41
+ <Button variant="link">Ακύρωση</Button>
42
+ </ModalAction>
43
+ </Modal>
44
+ );
45
+ },
46
+ args: {
47
+ dense: false,
48
+ gaps: true,
49
+ },
50
+ argsTypes: {
51
+ dense: {
52
+ control: 'boolean',
53
+ },
54
+ gaps: {
55
+ control: 'boolean',
56
+ },
57
+ },
58
+ };
59
+ export { Default } from '@digigov/ui/app/Modal/__stories__/Default';
60
+ export { AlertDialog } from '@digigov/ui/app/Modal/__stories__/AlertDialog';
61
+ export { Dense } from '@digigov/ui/app/Modal/__stories__/Dense';
62
+ export { WithHooks } from '@digigov/ui/app/Modal/__stories__/WithHooks';
63
+ export { Auto } from '@digigov/ui/app/Modal/__stories__/Auto';
64
+ export { WithoutModalGaps } from '@digigov/ui/app/Modal/__stories__/WithoutModalGaps';
@@ -13,7 +13,7 @@ import { Paragraph } from '@digigov/ui/typography/Paragraph';
13
13
  export const AlertDialog = (_: any) => {
14
14
  const [open, setOpen] = useState(false);
15
15
  return (
16
- <div>
16
+ <div style={{ minHeight: '300px' }}>
17
17
  <Button
18
18
  color="warning"
19
19
  onClick={() => {
@@ -13,7 +13,7 @@ import { LabelContainer } from '@digigov/ui/form/LabelContainer';
13
13
  import { TextInput } from '@digigov/ui/form/TextInput';
14
14
  export const Auto = (_: any) => {
15
15
  return (
16
- <div>
16
+ <div style={{ minHeight: '300px' }}>
17
17
  <ModalProvider>
18
18
  <ModalButtonAuto open modal="modal-1">
19
19
  Προσθήκη τηλεφώνου
@@ -15,7 +15,7 @@ import { TextInput } from '@digigov/ui/form/TextInput';
15
15
  export const Default = (_: any) => {
16
16
  const [open, setOpen] = useState(false);
17
17
  return (
18
- <div>
18
+ <div style={{ minHeight: '300px' }}>
19
19
  <Button
20
20
  onClick={() => {
21
21
  setOpen(!open);
@@ -15,7 +15,7 @@ import { TextInput } from '@digigov/ui/form/TextInput';
15
15
  export const Dense = (_: any) => {
16
16
  const [open, setOpen] = useState(false);
17
17
  return (
18
- <div>
18
+ <div style={{ minHeight: '300px' }}>
19
19
  <Button
20
20
  onClick={() => {
21
21
  setOpen(!open);
@@ -14,7 +14,7 @@ import { TextInput } from '@digigov/ui/form/TextInput';
14
14
  export const WithHooks = (_: any) => {
15
15
  const { registerModal, registerAction } = useModal();
16
16
  return (
17
- <div>
17
+ <div style={{ minHeight: '300px' }}>
18
18
  <Button {...registerAction('modal-1', 'open')}>Προσθήκη τηλεφώνου</Button>
19
19
  <Modal
20
20
  {...registerModal('modal-1', {
@@ -15,7 +15,7 @@ import { TextInput } from '@digigov/ui/form/TextInput';
15
15
  export const WithoutModalGaps = (_: any) => {
16
16
  const [open, setOpen] = useState(false);
17
17
  return (
18
- <div>
18
+ <div style={{ minHeight: '300px' }}>
19
19
  <Button
20
20
  onClick={() => {
21
21
  setOpen(!open);
@@ -0,0 +1,105 @@
1
+ import { useCallback, useEffect, useRef } from 'react';
2
+
3
+ // Unique ID for the aria-live notification area element.
4
+ const notificationAreaId = 'loader-notification-area';
5
+ // Custom attribute to track active spinners
6
+ const activeSpinnersAttr = 'data-active-spinners';
7
+
8
+ // Generates a random unique ID for each spinner instance.
9
+ function generateUniqueId() {
10
+ return `spinner-${Math.random().toString(36).substring(2, 9)}`;
11
+ }
12
+
13
+ // Finds or creates the notification area element in the DOM.
14
+ const getOrCreateNotificationArea = (): HTMLElement => {
15
+ let element = document.getElementById(notificationAreaId);
16
+
17
+ // Create and append it to the DOM.
18
+ if (!element) {
19
+ element = document.createElement('div');
20
+ element.id = notificationAreaId;
21
+ element.setAttribute('role', 'status');
22
+ element.setAttribute('aria-live', 'polite');
23
+ element.className = 'ds-visually-hidden';
24
+ document.body.appendChild(element);
25
+ }
26
+
27
+ return element;
28
+ };
29
+
30
+ export const useNotificationArea = (
31
+ loadingText = 'Γίνεται φόρτωση...',
32
+ finishedText = 'Η φόρτωση ολοκληρώθηκε.'
33
+ ) => {
34
+ // Unique ID for this spinner.
35
+ const spinnerId = useRef(generateUniqueId());
36
+ // Reference to the notification area DOM element.
37
+ const notificationRef = useRef<HTMLElement | null>(null);
38
+
39
+ // Returns an array of active spinner IDs.
40
+ const getActiveIds = useCallback(() => {
41
+ const current = notificationRef.current;
42
+ const value = current?.getAttribute(activeSpinnersAttr) || '';
43
+ return value.split(',').filter(Boolean);
44
+ }, [notificationRef]);
45
+
46
+ // Adds this spinner's ID to the active list.
47
+ const setActiveSpinnerId = useCallback(() => {
48
+ const current = notificationRef.current;
49
+ if (current) {
50
+ const ids = new Set(getActiveIds());
51
+ ids.add(spinnerId.current);
52
+ current.setAttribute(activeSpinnersAttr, Array.from(ids).join(','));
53
+ }
54
+ }, [notificationRef, getActiveIds, spinnerId]);
55
+
56
+ // Removes this spinner's ID from the active list.
57
+ const unsetActiveSpinnerId = useCallback(() => {
58
+ const current = notificationRef.current;
59
+ if (current) {
60
+ const ids = getActiveIds().filter((id) => id !== spinnerId.current);
61
+ current.setAttribute(activeSpinnersAttr, ids.join(','));
62
+ }
63
+ }, [notificationRef, getActiveIds, spinnerId]);
64
+
65
+ // Updates the text content of the aria-live region.
66
+ const setTextContent = (text: string) => {
67
+ if (notificationRef.current) {
68
+ notificationRef.current.textContent = text;
69
+ }
70
+ };
71
+
72
+ useEffect(() => {
73
+ if (typeof document === 'undefined') return;
74
+
75
+ // Set up notification area and mark this spinner as active.
76
+ notificationRef.current = getOrCreateNotificationArea();
77
+ setActiveSpinnerId();
78
+ setTextContent(loadingText);
79
+
80
+ // Cleanup when component unmounts.
81
+ return () => {
82
+ unsetActiveSpinnerId();
83
+
84
+ // If no active spinners remain, announce "finished" and clear the text.
85
+ if (getActiveIds().length === 0) {
86
+ setTextContent(finishedText);
87
+
88
+ // Give screen readers a chance to announce "finished" before clearing.
89
+ setTimeout(() => {
90
+ const el = notificationRef.current;
91
+ if (el && getActiveIds().length === 0) {
92
+ el.removeAttribute(activeSpinnersAttr);
93
+ el.textContent = '';
94
+ }
95
+ }, 1000);
96
+ }
97
+ };
98
+ }, [
99
+ loadingText,
100
+ finishedText,
101
+ setActiveSpinnerId,
102
+ unsetActiveSpinnerId,
103
+ getActiveIds,
104
+ ]);
105
+ };
@@ -31,7 +31,10 @@ export const WithControls = {
31
31
  >
32
32
  <AccordionSection open>
33
33
  <AccordionSectionSummary>
34
- <AccordionSectionSummaryHeading aria-controls="content1">
34
+ <AccordionSectionSummaryHeading
35
+ aria-controls="content1"
36
+ variant={args.variant}
37
+ >
35
38
  {args.title}
36
39
  </AccordionSectionSummaryHeading>
37
40
  {args.hint > 0 && <Hint>{args.hintMessage}</Hint>}
@@ -45,6 +48,7 @@ export const WithControls = {
45
48
  },
46
49
  args: {
47
50
  title: 'Διαφορές με το δημόσιο',
51
+ variant: 'default',
48
52
  hint: true,
49
53
  hintMessage:
50
54
  'Δικαστικές και εξωδικαστικές διαφορές με το Δημόσιο, εκκαθάριση δικαστικών δαπανών κ.ά.',
@@ -58,6 +62,10 @@ export const WithControls = {
58
62
  title: {
59
63
  control: { type: 'text' },
60
64
  },
65
+ variant: {
66
+ options: ['default', 'arrows'],
67
+ control: { type: 'select' },
68
+ },
61
69
  hint: {
62
70
  control: { type: 'boolean' },
63
71
  },
@@ -11,11 +11,10 @@ The accordion component lets users show and hide sections of related content on
11
11
 
12
12
  ## How to use
13
13
 
14
- ### Default Accordion
15
14
 
16
15
  <code src="@digigov/ui/content/Accordion/__stories__/Default.tsx" />
17
16
 
18
- ### Accordion with Hints
17
+ ### With Hints
19
18
 
20
19
  Accordions hide content, so the labels need to be clear. If necessary, you can add a summary line to help users understand what is in the section.
21
20
 
@@ -12,55 +12,55 @@ When used correctly, Cards can help users to scan through vast amounts of inform
12
12
 
13
13
  <code src="@digigov/ui/content/Card/__stories__/Default.tsx" />
14
14
 
15
- #### Card with gray border color
15
+ ### With gray border color
16
16
 
17
17
  <code src="@digigov/ui/content/Card/__stories__/WithGrayBorder.tsx" />
18
18
 
19
- #### Card with dark border color
19
+ ### With dark border color
20
20
 
21
21
  <code src="@digigov/ui/content/Card/__stories__/WithDarkBorder.tsx" />
22
22
 
23
- ### Card with top border
23
+ ### With top border
24
24
 
25
25
  You can set the color of the Card's top border. You can choose between dark and grey color respectively. By default the top border color is grey.
26
26
 
27
27
  <code src="@digigov/ui/content/Card/__stories__/WithDarkBorder.tsx" />
28
28
 
29
- #### Card with grey top border
29
+ ### With grey top border
30
30
 
31
31
  <code src="@digigov/ui/content/Card/__stories__/WithGrayTopBorder.tsx" />
32
32
 
33
- #### Card with dark top border
33
+ ### With dark top border
34
34
 
35
35
  <code src="@digigov/ui/content/Card/__stories__/WithDarkTopBorder.tsx" />
36
36
 
37
- ### Card with divider
37
+ ### With divider
38
38
 
39
39
  <code src="@digigov/ui/content/Card/__stories__/WithDivider.tsx" />
40
40
 
41
- ### Card with actions
41
+ ### With actions
42
42
 
43
43
  <code src="@digigov/ui/content/Card/__stories__/WithGroupButton.tsx" />
44
44
 
45
- #### Card with title link
45
+ ### With title link
46
46
 
47
47
  Cards can be used without an action button, but with a clickable title.
48
48
 
49
49
  <code src="@digigov/ui/content/Card/__stories__/WithLink.tsx" />
50
50
 
51
- #### Card with clickable content
51
+ ### With clickable content
52
52
 
53
53
  You can expand the clickable area of the link to fill Card's content.
54
54
 
55
55
  <code src="@digigov/ui/content/Card/__stories__/WithClickableContent.tsx" />
56
56
 
57
- #### Card with button or link
57
+ ### With button or link
58
58
 
59
59
  Cards also provides styles for actionable elements such as Buttons or Links.
60
60
 
61
61
  <code src="@digigov/ui/content/Card/__stories__/WithClickableLink.tsx" />
62
62
 
63
- #### Card with a group of actions
63
+ ### With a group of actions
64
64
 
65
65
  <code src="@digigov/ui/content/Card/__stories__/WithGroupButton.tsx" />
66
66
 
@@ -11,19 +11,19 @@ The Chip component can be used to represent small blocks of information.
11
11
 
12
12
  <code src="@digigov/ui/content/Chip/__stories__/Default.tsx" />
13
13
 
14
- ### ClickableChip
14
+ ### Clickable Chip
15
15
 
16
16
  <code src="@digigov/ui/content/Chip/__stories__/ClickableChip.tsx" />
17
17
 
18
- ### ClickableDeletableChip
18
+ ### Clickable and Deletable
19
19
 
20
20
  <code src="@digigov/ui/content/Chip/__stories__/ClickableDeletableChip.tsx" />
21
21
 
22
- ### DeletableChip
22
+ ### Deletable Chip
23
23
 
24
24
  <code src="@digigov/ui/content/Chip/__stories__/DeletableChip.tsx" />
25
25
 
26
- ### GroupOfChips
26
+ ### Group of Chips
27
27
 
28
28
  <code src="@digigov/ui/content/Chip/__stories__/GroupOfChips.tsx" />
29
29
 
@@ -9,15 +9,15 @@ title: List
9
9
 
10
10
  <code src="@digigov/ui/content/List/__stories__/Default.tsx" />
11
11
 
12
- ### List with bullets
12
+ ### With bullets
13
13
 
14
14
  <code src="@digigov/ui/content/List/__stories__/BulletList.tsx" />
15
15
 
16
- ### List with numbers
16
+ ### With numbers
17
17
 
18
18
  <code src="@digigov/ui/content/List/__stories__/NumberedList.tsx" />
19
19
 
20
- ### List with extra space
20
+ ### With extra space
21
21
 
22
22
  <code src="@digigov/ui/content/List/__stories__/WithExtraSpace.tsx" />
23
23
 
@@ -10,12 +10,13 @@ export default {
10
10
  import { SummaryListExample } from '@digigov/ui/content/SummaryList/__stories__/SummaryListExample';
11
11
  import doc from './doc.mdx?raw';
12
12
 
13
- export const Default = {
13
+ export const WithControls = {
14
14
  args: {
15
15
  sm: 5,
16
16
  md: 4,
17
17
  lg: 3,
18
18
  border: true,
19
+ error: false,
19
20
  noLastBorder: false,
20
21
  itemBorder: true,
21
22
  showKey: true,
@@ -23,3 +24,8 @@ export const Default = {
23
24
  showActions: true,
24
25
  },
25
26
  };
27
+
28
+ export { Default } from '@digigov/ui/content/SummaryList/__stories__/Default';
29
+ export { WithActions } from '@digigov/ui/content/SummaryList/__stories__/WithActions';
30
+ export { WithoutBorders } from '@digigov/ui/content/SummaryList/__stories__/WithoutBorders';
31
+ export { WithError } from '@digigov/ui/content/SummaryList/__stories__/WithError';
@@ -34,6 +34,7 @@ export const SummaryListExample = ({
34
34
  md,
35
35
  lg,
36
36
  border = true,
37
+ error = false,
37
38
  noLastBorder = false,
38
39
  itemBorder = true,
39
40
  showKey = true,
@@ -44,18 +45,24 @@ export const SummaryListExample = ({
44
45
  md?: WidthValues;
45
46
  lg?: WidthValues;
46
47
  border?: boolean;
48
+ error?: boolean;
47
49
  noLastBorder?: boolean;
48
50
  itemBorder?: boolean;
49
51
  showKey?: boolean;
50
52
  showValue?: boolean;
51
53
  showActions?: boolean;
52
54
  }) => (
53
- <SummaryList border={border} noLastBorder={noLastBorder}>
55
+ <SummaryList border={border} noLastBorder={noLastBorder} error={error}>
54
56
  {data &&
55
57
  data.map((item, index) => (
56
58
  <SummaryListItem key={index} border={itemBorder}>
57
59
  {showKey && (
58
- <SummaryListItemKey sm={sm} md={md} lg={lg}>
60
+ <SummaryListItemKey
61
+ sm={sm}
62
+ md={md}
63
+ lg={lg}
64
+ error={error && index === 1}
65
+ >
59
66
  {item.key}
60
67
  </SummaryListItemKey>
61
68
  )}