@uva-glass/component-library 1.38.0 → 1.40.0

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 (113) hide show
  1. package/dist/Button.module-DfLXeuUK.js +14 -0
  2. package/dist/Button.module-DfLXeuUK.js.map +1 -0
  3. package/dist/{MenuLink-DzmKC6A7.js → MenuLink-CSnr2Az4.js} +3 -3
  4. package/dist/{MenuLink-DzmKC6A7.js.map → MenuLink-CSnr2Az4.js.map} +1 -1
  5. package/dist/{MultiSelect-Drcfmp0z.js → MultiSelect-Blc_VDxu.js} +2 -2
  6. package/dist/{MultiSelect-Drcfmp0z.js.map → MultiSelect-Blc_VDxu.js.map} +1 -1
  7. package/dist/MultiSelectItem-CPf7drsR.js +24 -0
  8. package/dist/MultiSelectItem-CPf7drsR.js.map +1 -0
  9. package/dist/assets/ActionList.css +1 -0
  10. package/dist/assets/Button.css +1 -1
  11. package/dist/assets/Container.css +1 -1
  12. package/dist/assets/CourseCard.css +1 -0
  13. package/dist/assets/CourseCardHeader.css +1 -0
  14. package/dist/assets/CourseCardOffering.css +1 -0
  15. package/dist/assets/MultiSelectItem.css +1 -1
  16. package/dist/assets/Periods.css +1 -1
  17. package/dist/assets/StatusPill.css +1 -1
  18. package/dist/components/ActionList/ActionList.d.ts +12 -0
  19. package/dist/components/ActionList/ActionList.js +76 -0
  20. package/dist/components/ActionList/ActionList.js.map +1 -0
  21. package/dist/components/ActionList/ActionList.stories.d.ts +6 -0
  22. package/dist/components/ActionList/ActionList.stories.js +29 -0
  23. package/dist/components/ActionList/ActionList.stories.js.map +1 -0
  24. package/dist/components/ActionList/index.d.ts +1 -0
  25. package/dist/components/ActionList/index.js +5 -0
  26. package/dist/components/ActionList/index.js.map +1 -0
  27. package/dist/components/Button/Button.js +14 -21
  28. package/dist/components/Button/Button.js.map +1 -1
  29. package/dist/components/Button/Button.stories.js +1 -1
  30. package/dist/components/Checkbox/Checkbox.stories.js +1 -1
  31. package/dist/components/CourseCard/CourseCard.d.ts +33 -0
  32. package/dist/components/CourseCard/CourseCard.js +50 -0
  33. package/dist/components/CourseCard/CourseCard.js.map +1 -0
  34. package/dist/components/CourseCard/CourseCard.stories.d.ts +7 -0
  35. package/dist/components/CourseCard/CourseCard.stories.js +461 -0
  36. package/dist/components/CourseCard/CourseCard.stories.js.map +1 -0
  37. package/dist/components/CourseCard/CourseCardHeader/CourseCardHeader.d.ts +13 -0
  38. package/dist/components/CourseCard/CourseCardHeader/CourseCardHeader.js +39 -0
  39. package/dist/components/CourseCard/CourseCardHeader/CourseCardHeader.js.map +1 -0
  40. package/dist/components/CourseCard/CourseCardHeader/index.d.ts +1 -0
  41. package/dist/components/CourseCard/CourseCardHeader/index.js +5 -0
  42. package/dist/components/CourseCard/CourseCardHeader/index.js.map +1 -0
  43. package/dist/components/CourseCard/CourseCardOffering/CourseCardOffering.d.ts +8 -0
  44. package/dist/components/CourseCard/CourseCardOffering/CourseCardOffering.js +24 -0
  45. package/dist/components/CourseCard/CourseCardOffering/CourseCardOffering.js.map +1 -0
  46. package/dist/components/CourseCard/CourseCardOffering/index.d.ts +1 -0
  47. package/dist/components/CourseCard/CourseCardOffering/index.js +5 -0
  48. package/dist/components/CourseCard/CourseCardOffering/index.js.map +1 -0
  49. package/dist/components/CourseCard/index.d.ts +1 -0
  50. package/dist/components/CourseCard/index.js +5 -0
  51. package/dist/components/CourseCard/index.js.map +1 -0
  52. package/dist/components/CourseCard/mockdata.d.ts +23 -0
  53. package/dist/components/Drawer/Drawer.js +1 -1
  54. package/dist/components/Drawer/Drawer.stories.js +2 -2
  55. package/dist/components/Icon/icons/index.d.ts +12 -0
  56. package/dist/components/Icon/icons/index.js +60 -56
  57. package/dist/components/Icon/icons/index.js.map +1 -1
  58. package/dist/components/IconButton/IconButton.stories.js +1 -1
  59. package/dist/components/InputField/InputField.stories.js +2 -2
  60. package/dist/components/MenuButton/MenuButton.d.ts +13 -0
  61. package/dist/components/MenuButton/MenuButton.js +621 -0
  62. package/dist/components/MenuButton/MenuButton.js.map +1 -0
  63. package/dist/components/MenuButton/MenuButton.stories.d.ts +8 -0
  64. package/dist/components/MenuButton/MenuButton.stories.js +58 -0
  65. package/dist/components/MenuButton/MenuButton.stories.js.map +1 -0
  66. package/dist/components/MenuButton/index.d.ts +1 -0
  67. package/dist/components/MenuButton/index.js +5 -0
  68. package/dist/components/MenuButton/index.js.map +1 -0
  69. package/dist/components/MenuLink/MenuLink.js +1 -1
  70. package/dist/components/MenuLink/MenuLink.stories.js +1 -1
  71. package/dist/components/MenuLink/index.js +1 -1
  72. package/dist/components/ModalDialog/ModalDialog.js +1 -1
  73. package/dist/components/ModalDialog/ModalDialog.stories.js +2 -2
  74. package/dist/components/MultiSelect/MultiSelect.js +2 -2
  75. package/dist/components/MultiSelect/MultiSelect.stories.js +25 -24
  76. package/dist/components/MultiSelect/MultiSelect.stories.js.map +1 -1
  77. package/dist/components/MultiSelect/components/MultiSelectHeader.js +2 -2
  78. package/dist/components/MultiSelect/components/MultiSelectItem.d.ts +2 -1
  79. package/dist/components/MultiSelect/components/MultiSelectItem.js +1 -1
  80. package/dist/components/MultiSelect/index.js +1 -1
  81. package/dist/components/OverlayCloseButton/OverlayCloseButton.stories.js +1 -1
  82. package/dist/components/Periods/Periods.d.ts +2 -2
  83. package/dist/components/Periods/Periods.js +27 -19
  84. package/dist/components/Periods/Periods.js.map +1 -1
  85. package/dist/components/Periods/Periods.stories.js.map +1 -1
  86. package/dist/components/ProgrammeCard/ProgrammeCard.stories.js +2 -2
  87. package/dist/components/SelectListbox/SelectListBox.stories.js +1 -1
  88. package/dist/components/StatusPill/StatusPill.d.ts +1 -1
  89. package/dist/components/StatusPill/StatusPill.js +8 -7
  90. package/dist/components/StatusPill/StatusPill.js.map +1 -1
  91. package/dist/components/index.d.ts +3 -0
  92. package/dist/components/index.js +71 -65
  93. package/dist/components/index.js.map +1 -1
  94. package/dist/components/storyComponents/Container/Container.js +12 -12
  95. package/dist/focusSafely-b94Glb9J.js +402 -0
  96. package/dist/focusSafely-b94Glb9J.js.map +1 -0
  97. package/dist/{index-CPfft0rG.js → index-0Faxlks_.js} +12 -11
  98. package/dist/index-0Faxlks_.js.map +1 -0
  99. package/dist/{index-DDSOrTSz.js → index-HuvfQN5H.js} +3 -3
  100. package/dist/{index-DDSOrTSz.js.map → index-HuvfQN5H.js.map} +1 -1
  101. package/dist/index.js +71 -65
  102. package/dist/index.js.map +1 -1
  103. package/dist/types/UserInterface.d.ts +4 -0
  104. package/dist/types/UserInterface.js +2 -0
  105. package/dist/types/UserInterface.js.map +1 -0
  106. package/dist/useDialog-DZhIlo2a.js +785 -0
  107. package/dist/useDialog-DZhIlo2a.js.map +1 -0
  108. package/package.json +24 -21
  109. package/dist/MultiSelectItem-CwKowz2B.js +0 -24
  110. package/dist/MultiSelectItem-CwKowz2B.js.map +0 -1
  111. package/dist/index-CPfft0rG.js.map +0 -1
  112. package/dist/useDialog-udvbFTBT.js +0 -1133
  113. package/dist/useDialog-udvbFTBT.js.map +0 -1
@@ -1 +1 @@
1
- ._status-pill_x7rv2_1{align-items:center;border-radius:1.5rem;display:flex;gap:.25rem;padding:.25rem .5rem;width:fit-content}._status-pill__possible_x7rv2_10{background-color:var(--color-mint-cream);color:var(--color-san-felix)}._status-pill__impossible_x7rv2_15{background-color:var(--color-amour);color:var(--color-uva-red-dark)}._status-pill--bar_x7rv2_20{border-radius:0;justify-content:center;padding:.5rem;width:100%}
1
+ ._status-pill_1dh6p_1{align-items:center;border-radius:1.5rem;display:flex;gap:.25rem;padding:.25rem .5rem;width:fit-content}._status-pill__possible_1dh6p_10{background-color:var(--color-mint-cream);color:var(--color-san-felix)}._status-pill__impossible_1dh6p_15{background-color:var(--color-amour);color:var(--color-uva-red-dark)}._status-pill__new_1dh6p_20{background-color:var(--color-blue-50);color:var(--color-blue-500)}._status-pill--bar_1dh6p_25{border-radius:0;justify-content:center;padding:.5rem;width:100%}
@@ -0,0 +1,12 @@
1
+ import { ReactElement } from 'react';
2
+ import { IconProps } from 'components/Icon';
3
+ import { UIButtonVariant } from 'types/UserInterface';
4
+
5
+ export interface ActionListProps {
6
+ label: string;
7
+ prefixIcon?: IconProps['name'];
8
+ iconName?: IconProps['name'];
9
+ variant?: UIButtonVariant;
10
+ children: ReactElement | ReactElement[];
11
+ }
12
+ export declare function ActionList({ label, prefixIcon, iconName, variant, children }: ActionListProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,76 @@
1
+ import { jsxs as k, jsx as c } from "react/jsx-runtime";
2
+ import { c as T } from "../../clsx-OuTLNxxd.js";
3
+ import { useId as U, useRef as m, Children as w, useState as b, useEffect as D } from "react";
4
+ import { MenuButton as $ } from "../MenuButton/MenuButton.js";
5
+ import { Icon as p } from "../Icon/Icon.js";
6
+ import '../../assets/ActionList.css';const h = {
7
+ "action-list": "_action-list_1vi7f_1",
8
+ "action-list--open": "_action-list--open_1vi7f_13",
9
+ "action-list-container": "_action-list-container_1vi7f_17"
10
+ }, O = -1, s = 1;
11
+ function K({ label: E, prefixIcon: C, iconName: I, variant: L = "secondary", children: a }) {
12
+ const _ = U(), l = m(null), n = m(null), r = m(null), d = w.count(a), [f, i] = b(O), [u, g] = b(!1);
13
+ function R() {
14
+ g(!0), document.addEventListener("click", N, { once: !1, capture: !0 });
15
+ }
16
+ function o(e) {
17
+ var t;
18
+ e && r.current && !r.current.contains(e.target) || (i(O), g(!1), document.removeEventListener("click", N, { capture: !0 }), (t = l.current) == null || t.focus());
19
+ }
20
+ function x() {
21
+ u ? o() : R();
22
+ }
23
+ function y(e) {
24
+ if (!u) return;
25
+ if (["ArrowUp", "ArrowDown", "Home", "End"].includes(e.code)) {
26
+ e.preventDefault();
27
+ return;
28
+ }
29
+ e.code === "Tab" && o();
30
+ }
31
+ function A(e) {
32
+ (e.code === "Space" || e.key === "Enter") && (e.target === l.current ? x() : e.key === "Enter" && e.target !== n.current && "firstChild" in e.target && e.target.firstChild.click()), e.code === "Escape" && o(), e.code === "ArrowUp" && i((t) => t === 0 ? d - s : t - s), e.code === "ArrowDown" && i((t) => t === d - s ? 0 : t + s), e.code === "Home" && i(0), e.code === "End" && i(d - s);
33
+ }
34
+ const N = (e) => {
35
+ const { target: t } = e;
36
+ !t || !r.current || r.current.contains(t) || o();
37
+ };
38
+ return D(() => {
39
+ if (f < 0 || !n.current) return;
40
+ const e = n.current.children.item(f);
41
+ e && e.focus();
42
+ }, [f]), D(() => {
43
+ !n.current || !n.current.hasChildNodes() || Array.from(n.current.children).filter((e) => e.nodeType === Node.ELEMENT_NODE && e.hasChildNodes()).forEach((e) => {
44
+ Array.from(e.children).filter((t) => t.nodeType === Node.ELEMENT_NODE).forEach((t) => {
45
+ t.setAttribute("tabIndex", "-1");
46
+ });
47
+ });
48
+ }, [a]), /* @__PURE__ */ k("div", { className: h["action-list-container"], ref: r, children: [
49
+ /* @__PURE__ */ k($, { onClick: x, onKeyDown: y, onKeyUp: A, buttonRef: l, variant: L, children: [
50
+ C && /* @__PURE__ */ c(p, { size: 24, name: C }),
51
+ E,
52
+ I ? /* @__PURE__ */ c(p, { size: 24, name: I }) : /* @__PURE__ */ c(p, { size: 16, name: u ? "CheveronUp" : "CheveronDown" })
53
+ ] }),
54
+ /* @__PURE__ */ c(
55
+ "div",
56
+ {
57
+ "aria-activedescendant": `${_}-child-${f}`,
58
+ "aria-label": E,
59
+ className: T(h["action-list"], {
60
+ [h["action-list--open"]]: u
61
+ }),
62
+ onClickCapture: o,
63
+ onKeyDown: y,
64
+ onKeyUp: A,
65
+ ref: n,
66
+ role: "menu",
67
+ tabIndex: -1,
68
+ children: w.map(a, (e, t) => /* @__PURE__ */ c("div", { role: "menuitem", tabIndex: -1, children: e }, `${_}-child-${t}`))
69
+ }
70
+ )
71
+ ] });
72
+ }
73
+ export {
74
+ K as ActionList
75
+ };
76
+ //# sourceMappingURL=ActionList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActionList.js","sources":["../../../src/components/ActionList/ActionList.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport { Children, useEffect, useId, useRef, useState } from 'react';\n\nimport type { KeyboardEvent, ReactElement, MouseEvent as ReactMouseEvent } from 'react';\nimport type { IconProps } from 'components/Icon';\nimport type { UIButtonVariant } from 'types/UserInterface';\n\nimport styles from './ActionList.module.css';\n\nimport { MenuButton } from 'components/MenuButton';\nimport { Icon } from 'components/Icon';\n\nexport interface ActionListProps {\n label: string;\n prefixIcon?: IconProps['name'];\n iconName?: IconProps['name'];\n variant?: UIButtonVariant;\n children: ReactElement | ReactElement[];\n}\n\nconst inactiveIndex = -1;\nconst indexIncrement = 1;\n\nexport function ActionList({ label, prefixIcon, iconName, variant = 'secondary', children }: ActionListProps) {\n const listId = useId();\n const triggerRef = useRef<HTMLButtonElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const numberOfChildren = Children.count(children);\n\n const [activeIndex, setActiveIndex] = useState(inactiveIndex);\n const [isOpen, setIsOpen] = useState(false);\n\n function open() {\n setIsOpen(true);\n\n document.addEventListener('click', onClickOutside, { once: false, capture: true });\n }\n\n function close(event?: ReactMouseEvent<HTMLDivElement>) {\n // When a click occurs on an element that is not an immediate descendant of the action list container\n // (can happen when a modal window is triggered from a button in the action list), the setIsOpen state\n // handler should not be called, because this causes a re-render of the entire component and can lead\n // to undesired effects, like a select element closing immediately after it has been clicked.\n if (event && containerRef.current && !containerRef.current.contains(event.target as Node)) {\n return;\n }\n\n setActiveIndex(inactiveIndex);\n setIsOpen(false);\n\n document.removeEventListener('click', onClickOutside, { capture: true });\n\n triggerRef.current?.focus();\n }\n\n function toggle() {\n if (isOpen) close();\n else open();\n }\n\n function onKeyDown(event: KeyboardEvent) {\n if (!isOpen) return;\n\n const eventPreventCodes = ['ArrowUp', 'ArrowDown', 'Home', 'End'];\n\n if (eventPreventCodes.includes(event.code)) {\n // prevent page from scrolling when navigating through items in list\n event.preventDefault();\n return;\n }\n\n if (event.code === 'Tab') {\n close();\n }\n }\n\n function onKeyUp(event: KeyboardEvent) {\n if (event.code === 'Space' || event.key === 'Enter') {\n if (event.target === triggerRef.current) {\n toggle();\n } else if (event.key === 'Enter' && event.target !== listRef.current) {\n if ('firstChild' in event.target) {\n const firstChild = event.target.firstChild as HTMLButtonElement;\n\n firstChild.click();\n }\n }\n }\n\n if (event.code === 'Escape') close();\n\n if (event.code === 'ArrowUp') {\n setActiveIndex((prevState) => {\n if (prevState === 0) return numberOfChildren - indexIncrement;\n\n return prevState - indexIncrement;\n });\n }\n\n if (event.code === 'ArrowDown') {\n setActiveIndex((prevState) => {\n if (prevState === numberOfChildren - indexIncrement) return 0;\n\n return prevState + indexIncrement;\n });\n }\n\n if (event.code === 'Home') {\n setActiveIndex(0);\n }\n\n if (event.code === 'End') {\n setActiveIndex(numberOfChildren - indexIncrement);\n }\n }\n\n const onClickOutside = (event: MouseEvent) => {\n const { target } = event;\n\n if (!target || !containerRef.current) return;\n\n if (!containerRef.current.contains(target as Node)) {\n close();\n }\n };\n\n useEffect(() => {\n if (activeIndex < 0 || !listRef.current) return;\n\n const listItem = listRef.current.children.item(activeIndex);\n\n if (listItem) {\n (listItem as HTMLDivElement).focus();\n }\n }, [activeIndex]);\n\n useEffect(() => {\n if (!listRef.current || !listRef.current.hasChildNodes()) return;\n\n Array.from(listRef.current.children)\n .filter((overlayChild) => overlayChild.nodeType === Node.ELEMENT_NODE && overlayChild.hasChildNodes())\n .forEach((overlayChild) => {\n Array.from(overlayChild.children)\n .filter((childOfChild) => childOfChild.nodeType === Node.ELEMENT_NODE)\n .forEach((childOfChild) => {\n // internal children may be buttons and can get focus when tab is pressed; preventing those elements\n // from getting focus so that list can be tabbed over and traversed with arrow keys\n childOfChild.setAttribute('tabIndex', '-1');\n });\n });\n }, [children]);\n\n return (\n <div className={styles['action-list-container']} ref={containerRef}>\n <MenuButton onClick={toggle} onKeyDown={onKeyDown} onKeyUp={onKeyUp} buttonRef={triggerRef} variant={variant}>\n {prefixIcon && <Icon size={24} name={prefixIcon} />}\n {label}\n {iconName ? (\n <Icon size={24} name={iconName} />\n ) : (\n <Icon size={16} name={isOpen ? 'CheveronUp' : 'CheveronDown'} />\n )}\n </MenuButton>\n <div\n aria-activedescendant={`${listId}-child-${activeIndex}`}\n aria-label={label}\n className={clsx(styles['action-list'], {\n [styles['action-list--open']]: isOpen,\n })}\n onClickCapture={close}\n onKeyDown={onKeyDown}\n onKeyUp={onKeyUp}\n ref={listRef}\n role=\"menu\"\n tabIndex={-1}\n >\n {Children.map(children, (child, index) => (\n <div key={`${listId}-child-${index}`} role=\"menuitem\" tabIndex={-1}>\n {child}\n </div>\n ))}\n </div>\n </div>\n );\n}\n"],"names":["inactiveIndex","indexIncrement","ActionList","label","prefixIcon","iconName","variant","children","listId","useId","triggerRef","useRef","listRef","containerRef","numberOfChildren","Children","activeIndex","setActiveIndex","useState","isOpen","setIsOpen","open","onClickOutside","close","event","_a","toggle","onKeyDown","onKeyUp","prevState","target","useEffect","listItem","overlayChild","childOfChild","styles","jsxs","MenuButton","jsx","Icon","clsx","child","index"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Meta } from '@storybook/react';
2
+ import { ActionListProps } from './ActionList';
3
+
4
+ declare const _default: Meta<ActionListProps>;
5
+ export default _default;
6
+ export declare const ActionListExample: import('@storybook/csf').AnnotatedStoryFn<import('@storybook/react').ReactRenderer, ActionListProps>;
@@ -0,0 +1,29 @@
1
+ import { jsx as t } from "react/jsx-runtime";
2
+ import { ActionList as i } from "./ActionList.js";
3
+ const a = {
4
+ title: "Atoms/ActionList",
5
+ component: i,
6
+ argTypes: {
7
+ variant: {
8
+ options: ["primary", "secondary", "destructive-primary", "destructive-secondary", "blank", "blank-icon"],
9
+ control: { type: "radio" }
10
+ }
11
+ }
12
+ }, o = (n) => /* @__PURE__ */ t("div", { style: { marginLeft: "5rem", width: "40px" }, children: /* @__PURE__ */ t(i, { ...n }) }), e = {
13
+ label: "",
14
+ variant: "blank-icon",
15
+ iconName: "EllipsisVertical",
16
+ children: [
17
+ /* @__PURE__ */ t("button", { type: "button", children: "Action 1" }, "1"),
18
+ /* @__PURE__ */ t("button", { type: "button", children: "Action 2" }, "2"),
19
+ /* @__PURE__ */ t("button", { type: "button", children: "Action 3" }, "3")
20
+ ]
21
+ }, r = o.bind({});
22
+ r.args = {
23
+ ...e
24
+ };
25
+ export {
26
+ r as ActionListExample,
27
+ a as default
28
+ };
29
+ //# sourceMappingURL=ActionList.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ActionList.stories.js","sources":["../../../src/components/ActionList/ActionList.stories.tsx"],"sourcesContent":["import type { Meta, StoryFn } from '@storybook/react';\nimport type { ActionListProps } from './ActionList';\n\nimport { ActionList } from './ActionList';\n\n// eslint-disable-next-line import/no-default-export\nexport default {\n title: 'Atoms/ActionList',\n component: ActionList,\n argTypes: {\n variant: {\n options: ['primary', 'secondary', 'destructive-primary', 'destructive-secondary', 'blank', 'blank-icon'],\n control: { type: 'radio' },\n },\n },\n} as Meta<ActionListProps>;\n\nconst Template: StoryFn<ActionListProps> = (args) => (\n <div style={{ marginLeft: '5rem', width: '40px' }}>\n <ActionList {...args} />\n </div>\n);\n\nconst defaultArgs: Partial<ActionListProps> = {\n label: '',\n variant: 'blank-icon',\n iconName: 'EllipsisVertical',\n children: [\n <button key=\"1\" type=\"button\">\n Action 1\n </button>,\n <button key=\"2\" type=\"button\">\n Action 2\n </button>,\n <button key=\"3\" type=\"button\">\n Action 3\n </button>,\n ],\n};\n\nexport const ActionListExample = Template.bind({});\nActionListExample.args = {\n ...defaultArgs,\n};\n"],"names":["ActionList_stories","ActionList","Template","args","jsx","defaultArgs","ActionListExample"],"mappings":";;AAMA,MAAeA,IAAA;AAAA,EACb,OAAO;AAAA,EACP,WAAWC;AAAA,EACX,UAAU;AAAA,IACR,SAAS;AAAA,MACP,SAAS,CAAC,WAAW,aAAa,uBAAuB,yBAAyB,SAAS,YAAY;AAAA,MACvG,SAAS,EAAE,MAAM,QAAQ;AAAA,IAC3B;AAAA,EACF;AACF,GAEMC,IAAqC,CAACC,MACzC,gBAAAC,EAAA,OAAA,EAAI,OAAO,EAAE,YAAY,QAAQ,OAAO,OACvC,GAAA,UAAA,gBAAAA,EAACH,GAAY,EAAA,GAAGE,GAAM,EACxB,CAAA,GAGIE,IAAwC;AAAA,EAC5C,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AAAA,IACP,gBAAAD,EAAA,UAAA,EAAe,MAAK,UAAS,wBAAlB,GAEZ;AAAA,IACC,gBAAAA,EAAA,UAAA,EAAe,MAAK,UAAS,wBAAlB,GAEZ;AAAA,IACC,gBAAAA,EAAA,UAAA,EAAe,MAAK,UAAS,wBAAlB,GAEZ;AAAA,EACF;AACF,GAEaE,IAAoBJ,EAAS,KAAK,EAAE;AACjDI,EAAkB,OAAO;AAAA,EACvB,GAAGD;AACL;"}
@@ -0,0 +1 @@
1
+ export * from './ActionList';
@@ -0,0 +1,5 @@
1
+ import { ActionList as i } from "./ActionList.js";
2
+ export {
3
+ i as ActionList
4
+ };
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,30 +1,23 @@
1
- import { jsx as b } from "react/jsx-runtime";
2
- import { c as _ } from "../../clsx-OuTLNxxd.js";
3
- import { forwardRef as a } from "react";
4
- import '../../assets/Button.css';const i = "_button_gc28t_3", t = {
5
- button: i,
6
- "button--blank": "_button--blank_gc28t_37",
7
- "button--primary": "_button--primary_gc28t_54",
8
- "button--secondary": "_button--secondary_gc28t_70",
9
- "button--destructive-primary": "_button--destructive-primary_gc28t_86",
10
- "button--destructive-secondary": "_button--destructive-secondary_gc28t_104",
11
- "button--wide-column": "_button--wide-column_gc28t_122"
12
- }, p = a((o, n) => {
13
- const { children: r, type: u = "button", variant: c, displayColumn: e = !1, ...s } = o;
14
- return /* @__PURE__ */ b(
1
+ import { jsx as u } from "react/jsx-runtime";
2
+ import { c as f } from "../../clsx-OuTLNxxd.js";
3
+ import { forwardRef as i } from "react";
4
+ import { s as t } from "../../Button.module-DfLXeuUK.js";
5
+ const d = i((o, r) => {
6
+ const { children: s, type: n = "button", variant: e, displayColumn: m = !1, ...a } = o;
7
+ return /* @__PURE__ */ u(
15
8
  "button",
16
9
  {
17
- ...s,
18
- type: u,
19
- ref: n,
20
- className: _(t.button, t[`button--${c}`], {
21
- [t["button--wide-column"]]: e
10
+ ...a,
11
+ type: n,
12
+ ref: r,
13
+ className: f(t.button, t[`button--${e}`], {
14
+ [t["button--wide-column"]]: m
22
15
  }),
23
- children: r
16
+ children: s
24
17
  }
25
18
  );
26
19
  });
27
20
  export {
28
- p as Button
21
+ d as Button
29
22
  };
30
23
  //# sourceMappingURL=Button.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Button.js","sources":["../../../src/components/Button/Button.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport { forwardRef } from 'react';\n\nimport type { ButtonHTMLAttributes, ReactNode } from 'react';\n\nimport styles from './Button.module.css';\n\nexport type UIButtonVariant = 'primary' | 'secondary' | 'destructive-primary' | 'destructive-secondary' | 'blank';\n\nexport interface ButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'className' | 'style'> {\n variant: UIButtonVariant;\n children: ReactNode;\n displayColumn?: boolean;\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>((props, forwardedRef) => {\n const { children, type = 'button', variant, displayColumn = false, ...restProps } = props;\n\n return (\n <button\n {...restProps}\n type={type}\n ref={forwardedRef}\n className={clsx(styles['button'], styles[`button--${variant}`], {\n [styles['button--wide-column']]: displayColumn,\n })}\n >\n {children}\n </button>\n );\n});\n"],"names":["Button","forwardRef","props","forwardedRef","children","type","variant","displayColumn","restProps","jsx","clsx","styles"],"mappings":";;;;;;;;;;;GAeaA,IAASC,EAA2C,CAACC,GAAOC,MAAiB;AAClF,QAAA,EAAE,UAAAC,GAAU,MAAAC,IAAO,UAAU,SAAAC,GAAS,eAAAC,IAAgB,IAAO,GAAGC,EAAc,IAAAN;AAGlF,SAAA,gBAAAO;AAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAGD;AAAA,MACJ,MAAAH;AAAA,MACA,KAAKF;AAAA,MACL,WAAWO,EAAKC,EAAO,QAAWA,EAAO,WAAWL,CAAO,EAAE,GAAG;AAAA,QAC9D,CAACK,EAAO,qBAAqB,CAAC,GAAGJ;AAAA,MAAA,CAClC;AAAA,MAEA,UAAAH;AAAA,IAAA;AAAA,EAAA;AAGP,CAAC;"}
1
+ {"version":3,"file":"Button.js","sources":["../../../src/components/Button/Button.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport { forwardRef } from 'react';\n\nimport type { ButtonHTMLAttributes, ReactNode } from 'react';\n\nimport styles from './Button.module.css';\n\nexport type UIButtonVariant = 'primary' | 'secondary' | 'destructive-primary' | 'destructive-secondary' | 'blank';\n\nexport interface ButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'className' | 'style'> {\n variant: UIButtonVariant;\n children: ReactNode;\n displayColumn?: boolean;\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>((props, forwardedRef) => {\n const { children, type = 'button', variant, displayColumn = false, ...restProps } = props;\n\n return (\n <button\n {...restProps}\n type={type}\n ref={forwardedRef}\n className={clsx(styles['button'], styles[`button--${variant}`], {\n [styles['button--wide-column']]: displayColumn,\n })}\n >\n {children}\n </button>\n );\n});\n"],"names":["Button","forwardRef","props","forwardedRef","children","type","variant","displayColumn","restProps","jsx","clsx","styles"],"mappings":";;;;AAeO,MAAMA,IAASC,EAA2C,CAACC,GAAOC,MAAiB;AAClF,QAAA,EAAE,UAAAC,GAAU,MAAAC,IAAO,UAAU,SAAAC,GAAS,eAAAC,IAAgB,IAAO,GAAGC,EAAc,IAAAN;AAGlF,SAAA,gBAAAO;AAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAGD;AAAA,MACJ,MAAAH;AAAA,MACA,KAAKF;AAAA,MACL,WAAWO,EAAKC,EAAO,QAAWA,EAAO,WAAWL,CAAO,EAAE,GAAG;AAAA,QAC9D,CAACK,EAAO,qBAAqB,CAAC,GAAGJ;AAAA,MAAA,CAClC;AAAA,MAEA,UAAAH;AAAA,IAAA;AAAA,EAAA;AAGP,CAAC;"}
@@ -1,5 +1,5 @@
1
1
  import { jsxs as o, Fragment as s, jsx as t } from "react/jsx-runtime";
2
- import { f as l } from "../../index-CPfft0rG.js";
2
+ import { f as l } from "../../index-0Faxlks_.js";
3
3
  import { Button as e } from "./Button.js";
4
4
  const u = {
5
5
  title: "Atoms/Button",
@@ -1,5 +1,5 @@
1
1
  import { jsxs as t, jsx as o } from "react/jsx-runtime";
2
- import { f as m } from "../../index-CPfft0rG.js";
2
+ import { f as m } from "../../index-0Faxlks_.js";
3
3
  import { Checkbox as e } from "./Checkbox.js";
4
4
  import { FormField as i } from "../FormField/FormField.js";
5
5
  import { Label as n } from "../Label/Label.js";
@@ -0,0 +1,33 @@
1
+ interface Offering {
2
+ academicYear: number;
3
+ courseId: string;
4
+ id: string;
5
+ offeringNumber: number;
6
+ periods: number[];
7
+ maxPeriods: number;
8
+ }
9
+ interface Name {
10
+ EN: string;
11
+ NL: string;
12
+ }
13
+ interface Courses {
14
+ code: string;
15
+ credits: number;
16
+ departmentId: string;
17
+ id: string;
18
+ level: string;
19
+ name: Name;
20
+ offerings: Offering[];
21
+ programmeId: string;
22
+ isNew: boolean;
23
+ }
24
+ export interface CourseCardProps {
25
+ course: Courses;
26
+ localeTags: Record<string, Record<'NL' | 'EN', string>>;
27
+ currentLanguage: 'NL' | 'EN';
28
+ actions?: Record<string, string>[];
29
+ onActionClick: ({ action, id }: Record<string, string>) => void;
30
+ onClick?: (id: string) => void;
31
+ }
32
+ export declare const CourseCard: ({ course, localeTags, currentLanguage, actions, onClick }: CourseCardProps) => import("react/jsx-runtime").JSX.Element;
33
+ export {};
@@ -0,0 +1,50 @@
1
+ import { jsxs as f, jsx as c } from "react/jsx-runtime";
2
+ import { c as C } from "../../clsx-OuTLNxxd.js";
3
+ import { CourseCardHeader as p } from "./CourseCardHeader/CourseCardHeader.js";
4
+ import { CourseCardOffering as v } from "./CourseCardOffering/CourseCardOffering.js";
5
+ import '../../assets/CourseCard.css';const s = {
6
+ "course-container": "_course-container_j1mva_3",
7
+ "course-container--clickable": "_course-container--clickable_j1mva_12",
8
+ "course__instance-container": "_course__instance-container_j1mva_18"
9
+ }, N = ({ course: i, localeTags: n, currentLanguage: e, actions: t, onClick: o }) => {
10
+ const a = i.offerings, r = typeof o == "function", d = () => {
11
+ r && o(i.id);
12
+ };
13
+ return /* @__PURE__ */ f(
14
+ "div",
15
+ {
16
+ className: C(s["course-container"], r && s["course-container--clickable"]),
17
+ ...o && { onClick: d },
18
+ children: [
19
+ /* @__PURE__ */ c(
20
+ p,
21
+ {
22
+ id: i.id,
23
+ code: i.code,
24
+ name: i.name[e],
25
+ credits: i.credits,
26
+ actions: t,
27
+ localeTags: n,
28
+ currentLanguage: e,
29
+ isNew: i.isNew ? n["is-new"][e] : void 0,
30
+ onActionClick: console.log
31
+ }
32
+ ),
33
+ /* @__PURE__ */ c("div", { className: s["course__instance-container"], children: a.map(({ id: m, periods: _, maxPeriods: l }) => /* @__PURE__ */ c(
34
+ v,
35
+ {
36
+ periods: _,
37
+ currentLanguage: e,
38
+ localeTags: n,
39
+ maxPeriods: l
40
+ },
41
+ m
42
+ )) })
43
+ ]
44
+ }
45
+ );
46
+ };
47
+ export {
48
+ N as CourseCard
49
+ };
50
+ //# sourceMappingURL=CourseCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CourseCard.js","sources":["../../../src/components/CourseCard/CourseCard.tsx"],"sourcesContent":["import clsx from 'clsx';\n\nimport styles from './CourseCard.module.css';\nimport { CourseCardHeader } from './CourseCardHeader';\nimport { CourseCardOffering } from './CourseCardOffering';\n\ninterface Offering {\n academicYear: number;\n courseId: string;\n id: string;\n offeringNumber: number;\n periods: number[];\n maxPeriods: number;\n}\n\ninterface Name {\n EN: string;\n NL: string;\n}\n\ninterface Courses {\n code: string;\n credits: number;\n departmentId: string;\n id: string;\n level: string;\n name: Name;\n offerings: Offering[];\n programmeId: string;\n isNew: boolean;\n}\n\nexport interface CourseCardProps {\n course: Courses;\n localeTags: Record<string, Record<'NL' | 'EN', string>>;\n currentLanguage: 'NL' | 'EN';\n actions?: Record<string, string>[];\n onActionClick: ({ action, id }: Record<string, string>) => void;\n onClick?: (id: string) => void;\n}\n\nexport const CourseCard = ({ course, localeTags, currentLanguage, actions, onClick }: CourseCardProps) => {\n const offerings = course.offerings;\n const isClickable = typeof onClick === 'function';\n\n const handleOnClick = () => {\n if (isClickable) onClick(course.id);\n };\n\n return (\n <div\n className={clsx(styles['course-container'], isClickable && styles['course-container--clickable'])}\n {...(onClick && { onClick: handleOnClick })}\n >\n <CourseCardHeader\n id={course.id}\n code={course.code}\n name={course.name[currentLanguage]}\n credits={course.credits}\n actions={actions}\n localeTags={localeTags}\n currentLanguage={currentLanguage}\n isNew={course.isNew ? localeTags['is-new'][currentLanguage] : undefined}\n onActionClick={console.log}\n />\n <div className={styles['course__instance-container']}>\n {offerings.map(({ id, periods, maxPeriods }) => (\n <CourseCardOffering\n periods={periods}\n key={id}\n currentLanguage={currentLanguage}\n localeTags={localeTags}\n maxPeriods={maxPeriods}\n />\n ))}\n </div>\n </div>\n );\n};\n"],"names":["CourseCard","course","localeTags","currentLanguage","actions","onClick","offerings","isClickable","handleOnClick","jsxs","clsx","styles","jsx","CourseCardHeader","id","periods","maxPeriods","CourseCardOffering"],"mappings":";;;;;;;;GAyCaA,IAAa,CAAC,EAAE,QAAAC,GAAQ,YAAAC,GAAY,iBAAAC,GAAiB,SAAAC,GAAS,SAAAC,QAA+B;AACxG,QAAMC,IAAYL,EAAO,WACnBM,IAAc,OAAOF,KAAY,YAEjCG,IAAgB,MAAM;AACtB,IAAAD,KAAqBF,EAAAJ,EAAO,EAAE;AAAA,EAAA;AAIlC,SAAA,gBAAAQ;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC,EAAKC,EAAO,kBAAkB,GAAGJ,KAAeI,EAAO,6BAA6B,CAAC;AAAA,MAC/F,GAAIN,KAAW,EAAE,SAASG,EAAc;AAAA,MAEzC,UAAA;AAAA,QAAA,gBAAAI;AAAA,UAACC;AAAA,UAAA;AAAA,YACC,IAAIZ,EAAO;AAAA,YACX,MAAMA,EAAO;AAAA,YACb,MAAMA,EAAO,KAAKE,CAAe;AAAA,YACjC,SAASF,EAAO;AAAA,YAChB,SAAAG;AAAA,YACA,YAAAF;AAAA,YACA,iBAAAC;AAAA,YACA,OAAOF,EAAO,QAAQC,EAAW,QAAQ,EAAEC,CAAe,IAAI;AAAA,YAC9D,eAAe,QAAQ;AAAA,UAAA;AAAA,QACzB;AAAA,QACC,gBAAAS,EAAA,OAAA,EAAI,WAAWD,EAAO,4BAA4B,GAChD,UAAUL,EAAA,IAAI,CAAC,EAAE,IAAAQ,GAAI,SAAAC,GAAS,YAAAC,EAC7B,MAAA,gBAAAJ;AAAA,UAACK;AAAA,UAAA;AAAA,YACC,SAAAF;AAAA,YAEA,iBAAAZ;AAAA,YACA,YAAAD;AAAA,YACA,YAAAc;AAAA,UAAA;AAAA,UAHKF;AAAA,QAKR,CAAA,GACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;"}
@@ -0,0 +1,7 @@
1
+ import { Meta } from '@storybook/react';
2
+ import { CourseCardProps } from './CourseCard';
3
+
4
+ declare const _default: Meta<CourseCardProps>;
5
+ export default _default;
6
+ export declare const CourseCardExample: import('@storybook/csf').AnnotatedStoryFn<import('@storybook/react').ReactRenderer, CourseCardProps>;
7
+ export declare const WithMultipleCourseCards: import('@storybook/csf').AnnotatedStoryFn<import('@storybook/react').ReactRenderer, CourseCardProps>;