jvetrau-ds 0.2.48 → 0.2.49
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/components/course-outline/course-outline.cjs +54 -41
- package/components/course-outline/course-outline.cjs.map +1 -1
- package/components/course-outline/course-outline.css +56 -3
- package/components/course-outline/course-outline.d.ts +4 -0
- package/components/course-outline/course-outline.js +52 -42
- package/components/course-outline/course-outline.js.map +1 -1
- package/components/course-outline/index.cjs +10 -1
- package/components/course-outline/index.d.ts +2 -2
- package/components/course-outline/index.js +1 -1
- package/components/index.cjs +4 -0
- package/components/index.d.ts +2 -2
- package/components/index.js +1 -1
- package/index.cjs +4 -0
- package/index.d.ts +2 -2
- package/index.js +1 -1
- package/package.json +1 -1
- package/styles.css +56 -3
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
3
5
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
6
|
var React = require('react');
|
|
5
7
|
require('./course-outline.css');
|
|
@@ -29,6 +31,41 @@ function getItemTitle(item) {
|
|
|
29
31
|
}
|
|
30
32
|
return hasContent(item.link) ? item.link : item.title;
|
|
31
33
|
}
|
|
34
|
+
function getItemClasses(item) {
|
|
35
|
+
return classnames.classnames(
|
|
36
|
+
"course-outline__item",
|
|
37
|
+
"",
|
|
38
|
+
{
|
|
39
|
+
"course-outline__item--active": Boolean(
|
|
40
|
+
item.active
|
|
41
|
+
),
|
|
42
|
+
"course-outline__item--disabled": Boolean(
|
|
43
|
+
item.disabled
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
const CourseOutlineItem = ({ item }) => {
|
|
49
|
+
const hasMeta = hasContent(item.meta);
|
|
50
|
+
const hasStatus = hasContent(item.status);
|
|
51
|
+
const hasAction = hasContent(item.action);
|
|
52
|
+
const hasFooter = hasStatus || hasAction;
|
|
53
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
54
|
+
"article",
|
|
55
|
+
{
|
|
56
|
+
className: "course-outline__item-body",
|
|
57
|
+
"aria-disabled": item.disabled ? "true" : void 0,
|
|
58
|
+
children: [
|
|
59
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "course-outline__title", children: getItemTitle(item) }),
|
|
60
|
+
hasMeta && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "course-outline__meta", children: item.meta }),
|
|
61
|
+
hasFooter && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "course-outline__footer", children: [
|
|
62
|
+
hasStatus && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "course-outline__status", children: item.status }),
|
|
63
|
+
hasAction && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "course-outline__action", children: item.action })
|
|
64
|
+
] })
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
};
|
|
32
69
|
const GroupTitle = ({
|
|
33
70
|
level,
|
|
34
71
|
children
|
|
@@ -139,46 +176,21 @@ const CourseOutline = ({
|
|
|
139
176
|
className: "course-outline__items",
|
|
140
177
|
id: groupContentId,
|
|
141
178
|
hidden: isCollapsed,
|
|
142
|
-
children: group.items.map((item) =>
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
}
|
|
158
|
-
);
|
|
159
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
160
|
-
"li",
|
|
161
|
-
{
|
|
162
|
-
className: itemClasses,
|
|
163
|
-
children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
164
|
-
"article",
|
|
165
|
-
{
|
|
166
|
-
className: "course-outline__item-body",
|
|
167
|
-
"aria-disabled": item.disabled ? "true" : void 0,
|
|
168
|
-
children: [
|
|
169
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "course-outline__title", children: getItemTitle(item) }),
|
|
170
|
-
hasMeta && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "course-outline__meta", children: item.meta }),
|
|
171
|
-
hasFooter && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "course-outline__footer", children: [
|
|
172
|
-
hasStatus && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "course-outline__status", children: item.status }),
|
|
173
|
-
hasAction && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "course-outline__action", children: item.action })
|
|
174
|
-
] })
|
|
175
|
-
]
|
|
176
|
-
}
|
|
177
|
-
)
|
|
178
|
-
},
|
|
179
|
-
item.id
|
|
180
|
-
);
|
|
181
|
-
})
|
|
179
|
+
children: group.items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
180
|
+
"li",
|
|
181
|
+
{
|
|
182
|
+
className: getItemClasses(
|
|
183
|
+
item
|
|
184
|
+
),
|
|
185
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
186
|
+
CourseOutlineItem,
|
|
187
|
+
{
|
|
188
|
+
item
|
|
189
|
+
}
|
|
190
|
+
)
|
|
191
|
+
},
|
|
192
|
+
item.id
|
|
193
|
+
))
|
|
182
194
|
}
|
|
183
195
|
)
|
|
184
196
|
]
|
|
@@ -191,6 +203,7 @@ const CourseOutline = ({
|
|
|
191
203
|
};
|
|
192
204
|
var course_outline_default = CourseOutline;
|
|
193
205
|
|
|
194
|
-
|
|
206
|
+
exports.CourseOutlineItem = CourseOutlineItem;
|
|
207
|
+
exports.default = course_outline_default;
|
|
195
208
|
//# sourceMappingURL=course-outline.cjs.map
|
|
196
209
|
//# sourceMappingURL=course-outline.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/course-outline/course-outline.tsx"],"names":["jsx","React","classnames","jsxs"],"mappings":"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","file":"course-outline.cjs","sourcesContent":["import React from 'react';\n\nimport './course-outline.css';\nimport { classnames } from '../helpers/classnames';\n\nexport type CourseOutlineHeadingLevel =\n | 2\n | 3\n | 4\n | 5\n | 6;\n\nexport interface CourseOutlineItem {\n id: React.Key;\n title: React.ReactNode;\n link?: React.ReactNode;\n meta?: React.ReactNode;\n status?: React.ReactNode;\n action?: React.ReactNode;\n active?: boolean;\n disabled?: boolean;\n}\n\nexport interface CourseOutlineGroup {\n id: React.Key;\n title: React.ReactNode;\n description?: React.ReactNode;\n items: CourseOutlineItem[];\n defaultCollapsed?: boolean;\n}\n\nexport interface CourseOutlineProps\n extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n > {\n groups: CourseOutlineGroup[];\n headingLevel?: CourseOutlineHeadingLevel;\n collapsible?: boolean;\n}\n\ntype CollapsedGroups = Map<React.Key, boolean>;\n\nfunction hasContent(\n value: React.ReactNode,\n): value is Exclude<\n React.ReactNode,\n null | undefined\n> {\n return value !== null && value !== undefined;\n}\n\nfunction getInitialCollapsedGroups(\n groups: CourseOutlineGroup[],\n): CollapsedGroups {\n return new Map(\n groups.map((group) => [\n group.id,\n Boolean(group.defaultCollapsed),\n ]),\n );\n}\n\nfunction getGroupCollapsed(\n collapsedGroups: CollapsedGroups,\n group: CourseOutlineGroup,\n) {\n return (\n collapsedGroups.get(group.id) ??\n Boolean(group.defaultCollapsed)\n );\n}\n\nfunction getItemTitle(\n item: CourseOutlineItem,\n): React.ReactNode {\n if (item.active) {\n return item.title;\n }\n\n return hasContent(item.link)\n ? item.link\n : item.title;\n}\n\ninterface GroupTitleProps {\n level?: CourseOutlineHeadingLevel;\n children: React.ReactNode;\n}\n\nconst GroupTitle: React.FC<GroupTitleProps> = ({\n level,\n children,\n}) => {\n if (!level) {\n return (\n <div className=\"course-outline__group-title\">\n {children}\n </div>\n );\n }\n\n switch (level) {\n case 2:\n return (\n <h2 className=\"course-outline__group-title\">\n {children}\n </h2>\n );\n\n case 3:\n return (\n <h3 className=\"course-outline__group-title\">\n {children}\n </h3>\n );\n\n case 4:\n return (\n <h4 className=\"course-outline__group-title\">\n {children}\n </h4>\n );\n\n case 5:\n return (\n <h5 className=\"course-outline__group-title\">\n {children}\n </h5>\n );\n\n default:\n return (\n <h6 className=\"course-outline__group-title\">\n {children}\n </h6>\n );\n }\n};\n\nconst CourseOutline: React.FC<CourseOutlineProps> = ({\n groups,\n headingLevel,\n collapsible = false,\n className = '',\n ...props\n}) => {\n const visibleGroups = React.useMemo(\n () =>\n groups.filter(\n (group) => group.items.length > 0,\n ),\n [groups],\n );\n\n const [collapsedGroups, setCollapsedGroups] =\n React.useState<CollapsedGroups>(() =>\n getInitialCollapsedGroups(visibleGroups),\n );\n\n const componentId = React.useId();\n\n React.useEffect(() => {\n if (!collapsible) {\n return;\n }\n\n setCollapsedGroups((current) => {\n const next = new Map(current);\n let changed = false;\n\n for (const group of visibleGroups) {\n if (!next.has(group.id)) {\n next.set(\n group.id,\n Boolean(group.defaultCollapsed),\n );\n\n changed = true;\n }\n }\n\n return changed ? next : current;\n });\n }, [collapsible, visibleGroups]);\n\n if (visibleGroups.length === 0) {\n return null;\n }\n\n const classes = classnames(\n 'course-outline',\n className,\n {\n 'course-outline--collapsible': collapsible,\n },\n );\n\n const toggleGroup = (\n group: CourseOutlineGroup,\n ) => {\n setCollapsedGroups((current) => {\n const next = new Map(current);\n\n next.set(\n group.id,\n !getGroupCollapsed(current, group),\n );\n\n return next;\n });\n };\n\n return (\n <div\n className={classes}\n {...props}\n >\n <ol className=\"course-outline__groups\">\n {visibleGroups.map((group, groupIndex) => {\n const isCollapsed =\n collapsible &&\n getGroupCollapsed(\n collapsedGroups,\n group,\n );\n\n const groupContentId =\n `${componentId}-group-${groupIndex}`;\n\n return (\n <li\n key={group.id}\n className=\"course-outline__group\"\n >\n <header className=\"course-outline__group-header\">\n <GroupTitle level={headingLevel}>\n {collapsible ? (\n <button\n className=\"course-outline__group-toggle\"\n type=\"button\"\n aria-expanded={!isCollapsed}\n aria-controls={groupContentId}\n onClick={() => toggleGroup(group)}\n >\n {group.title}\n </button>\n ) : (\n group.title\n )}\n </GroupTitle>\n </header>\n\n {hasContent(group.description) && (\n <div className=\"course-outline__group-description\">\n {group.description}\n </div>\n )}\n\n <ol\n className=\"course-outline__items\"\n id={groupContentId}\n hidden={isCollapsed}\n >\n {group.items.map((item) => {\n const hasMeta = hasContent(item.meta);\n const hasStatus = hasContent(\n item.status,\n );\n const hasAction = hasContent(\n item.action,\n );\n\n const hasFooter =\n hasStatus || hasAction;\n\n const itemClasses = classnames(\n 'course-outline__item',\n '',\n {\n 'course-outline__item--active':\n Boolean(item.active),\n\n 'course-outline__item--disabled':\n Boolean(item.disabled),\n },\n );\n\n return (\n <li\n key={item.id}\n className={itemClasses}\n >\n <article\n className=\"course-outline__item-body\"\n aria-disabled={\n item.disabled\n ? 'true'\n : undefined\n }\n >\n <div className=\"course-outline__title\">\n {getItemTitle(item)}\n </div>\n\n {hasMeta && (\n <div className=\"course-outline__meta\">\n {item.meta}\n </div>\n )}\n\n {hasFooter && (\n <div className=\"course-outline__footer\">\n {hasStatus && (\n <div className=\"course-outline__status\">\n {item.status}\n </div>\n )}\n\n {hasAction && (\n <div className=\"course-outline__action\">\n {item.action}\n </div>\n )}\n </div>\n )}\n </article>\n </li>\n );\n })}\n </ol>\n </li>\n );\n })}\n </ol>\n </div>\n );\n};\n\nexport default CourseOutline;\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/course-outline/course-outline.tsx"],"names":["classnames","jsxs","jsx","React"],"mappings":"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","file":"course-outline.cjs","sourcesContent":["import React from 'react';\n\nimport './course-outline.css';\nimport { classnames } from '../helpers/classnames';\n\nexport type CourseOutlineHeadingLevel =\n | 2\n | 3\n | 4\n | 5\n | 6;\n\nexport interface CourseOutlineItem {\n id: React.Key;\n title: React.ReactNode;\n link?: React.ReactNode;\n meta?: React.ReactNode;\n status?: React.ReactNode;\n action?: React.ReactNode;\n active?: boolean;\n disabled?: boolean;\n}\n\nexport interface CourseOutlineItemProps {\n item: CourseOutlineItem;\n}\n\nexport interface CourseOutlineGroup {\n id: React.Key;\n title: React.ReactNode;\n description?: React.ReactNode;\n items: CourseOutlineItem[];\n defaultCollapsed?: boolean;\n}\n\nexport interface CourseOutlineProps\n extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n > {\n groups: CourseOutlineGroup[];\n headingLevel?: CourseOutlineHeadingLevel;\n collapsible?: boolean;\n}\n\ntype CollapsedGroups = Map<React.Key, boolean>;\n\nfunction hasContent(\n value: React.ReactNode,\n): value is Exclude<\n React.ReactNode,\n null | undefined\n> {\n return value !== null && value !== undefined;\n}\n\nfunction getInitialCollapsedGroups(\n groups: CourseOutlineGroup[],\n): CollapsedGroups {\n return new Map(\n groups.map((group) => [\n group.id,\n Boolean(group.defaultCollapsed),\n ]),\n );\n}\n\nfunction getGroupCollapsed(\n collapsedGroups: CollapsedGroups,\n group: CourseOutlineGroup,\n) {\n return (\n collapsedGroups.get(group.id) ??\n Boolean(group.defaultCollapsed)\n );\n}\n\nfunction getItemTitle(\n item: CourseOutlineItem,\n): React.ReactNode {\n if (item.active) {\n return item.title;\n }\n\n return hasContent(item.link)\n ? item.link\n : item.title;\n}\n\nfunction getItemClasses(\n item: CourseOutlineItem,\n) {\n return classnames(\n 'course-outline__item',\n '',\n {\n 'course-outline__item--active': Boolean(\n item.active,\n ),\n\n 'course-outline__item--disabled': Boolean(\n item.disabled,\n ),\n },\n );\n}\n\nexport const CourseOutlineItem: React.FC<\n CourseOutlineItemProps\n> = ({ item }) => {\n const hasMeta = hasContent(item.meta);\n const hasStatus = hasContent(item.status);\n const hasAction = hasContent(item.action);\n const hasFooter = hasStatus || hasAction;\n\n return (\n <article\n className=\"course-outline__item-body\"\n aria-disabled={\n item.disabled ? 'true' : undefined\n }\n >\n <div className=\"course-outline__title\">\n {getItemTitle(item)}\n </div>\n\n {hasMeta && (\n <div className=\"course-outline__meta\">\n {item.meta}\n </div>\n )}\n\n {hasFooter && (\n <div className=\"course-outline__footer\">\n {hasStatus && (\n <div className=\"course-outline__status\">\n {item.status}\n </div>\n )}\n\n {hasAction && (\n <div className=\"course-outline__action\">\n {item.action}\n </div>\n )}\n </div>\n )}\n </article>\n );\n};\n\ninterface GroupTitleProps {\n level?: CourseOutlineHeadingLevel;\n children: React.ReactNode;\n}\n\nconst GroupTitle: React.FC<GroupTitleProps> = ({\n level,\n children,\n}) => {\n if (!level) {\n return (\n <div className=\"course-outline__group-title\">\n {children}\n </div>\n );\n }\n\n switch (level) {\n case 2:\n return (\n <h2 className=\"course-outline__group-title\">\n {children}\n </h2>\n );\n\n case 3:\n return (\n <h3 className=\"course-outline__group-title\">\n {children}\n </h3>\n );\n\n case 4:\n return (\n <h4 className=\"course-outline__group-title\">\n {children}\n </h4>\n );\n\n case 5:\n return (\n <h5 className=\"course-outline__group-title\">\n {children}\n </h5>\n );\n\n default:\n return (\n <h6 className=\"course-outline__group-title\">\n {children}\n </h6>\n );\n }\n};\n\nconst CourseOutline: React.FC<CourseOutlineProps> = ({\n groups,\n headingLevel,\n collapsible = false,\n className = '',\n ...props\n}) => {\n const visibleGroups = React.useMemo(\n () =>\n groups.filter(\n (group) => group.items.length > 0,\n ),\n [groups],\n );\n\n const [collapsedGroups, setCollapsedGroups] =\n React.useState<CollapsedGroups>(() =>\n getInitialCollapsedGroups(visibleGroups),\n );\n\n const componentId = React.useId();\n\n React.useEffect(() => {\n if (!collapsible) {\n return;\n }\n\n setCollapsedGroups((current) => {\n const next = new Map(current);\n let changed = false;\n\n for (const group of visibleGroups) {\n if (!next.has(group.id)) {\n next.set(\n group.id,\n Boolean(group.defaultCollapsed),\n );\n\n changed = true;\n }\n }\n\n return changed ? next : current;\n });\n }, [collapsible, visibleGroups]);\n\n if (visibleGroups.length === 0) {\n return null;\n }\n\n const classes = classnames(\n 'course-outline',\n className,\n {\n 'course-outline--collapsible': collapsible,\n },\n );\n\n const toggleGroup = (\n group: CourseOutlineGroup,\n ) => {\n setCollapsedGroups((current) => {\n const next = new Map(current);\n\n next.set(\n group.id,\n !getGroupCollapsed(current, group),\n );\n\n return next;\n });\n };\n\n return (\n <div\n className={classes}\n {...props}\n >\n <ol className=\"course-outline__groups\">\n {visibleGroups.map((group, groupIndex) => {\n const isCollapsed =\n collapsible &&\n getGroupCollapsed(\n collapsedGroups,\n group,\n );\n\n const groupContentId =\n `${componentId}-group-${groupIndex}`;\n\n return (\n <li\n key={group.id}\n className=\"course-outline__group\"\n >\n <header className=\"course-outline__group-header\">\n <GroupTitle level={headingLevel}>\n {collapsible ? (\n <button\n className=\"course-outline__group-toggle\"\n type=\"button\"\n aria-expanded={!isCollapsed}\n aria-controls={groupContentId}\n onClick={() => toggleGroup(group)}\n >\n {group.title}\n </button>\n ) : (\n group.title\n )}\n </GroupTitle>\n </header>\n\n {hasContent(group.description) && (\n <div className=\"course-outline__group-description\">\n {group.description}\n </div>\n )}\n\n <ol\n className=\"course-outline__items\"\n id={groupContentId}\n hidden={isCollapsed}\n >\n {group.items.map((item) => (\n <li\n key={item.id}\n className={getItemClasses(\n item,\n )}\n >\n <CourseOutlineItem\n item={item}\n />\n </li>\n ))}\n </ol>\n </li>\n );\n })}\n </ol>\n </div>\n );\n};\n\nexport default CourseOutline;\n"]}
|
|
@@ -77,6 +77,23 @@
|
|
|
77
77
|
.layout-sidebar__side .course-outline {
|
|
78
78
|
/* color */
|
|
79
79
|
|
|
80
|
+
/* typography */
|
|
81
|
+
|
|
82
|
+
/* size */
|
|
83
|
+
--course-outline-group-gap:
|
|
84
|
+
var(--margin-item);
|
|
85
|
+
|
|
86
|
+
/* border */
|
|
87
|
+
|
|
88
|
+
/* depth */
|
|
89
|
+
|
|
90
|
+
/* motion */
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.layout-sidebar__side
|
|
94
|
+
.course-outline__item-body {
|
|
95
|
+
/* color */
|
|
96
|
+
|
|
80
97
|
/* typography */
|
|
81
98
|
--course-outline-item-title-font-family:
|
|
82
99
|
var(--font-body-family);
|
|
@@ -90,8 +107,6 @@
|
|
|
90
107
|
var(--font-body-letter-spacing);
|
|
91
108
|
|
|
92
109
|
/* size */
|
|
93
|
-
--course-outline-group-gap:
|
|
94
|
-
var(--margin-item);
|
|
95
110
|
|
|
96
111
|
/* border */
|
|
97
112
|
|
|
@@ -102,7 +117,7 @@
|
|
|
102
117
|
|
|
103
118
|
.layout-sidebar__side
|
|
104
119
|
.course-outline__action,
|
|
105
|
-
.layout-sidebar__side
|
|
120
|
+
.layout-sidebar__side
|
|
106
121
|
.course-outline__meta {
|
|
107
122
|
/* color */
|
|
108
123
|
|
|
@@ -409,10 +424,48 @@ h4.course-outline__group-title {
|
|
|
409
424
|
|
|
410
425
|
.course-outline__item-body {
|
|
411
426
|
/* color */
|
|
427
|
+
--course-outline-meta-color: var(--color-text-note);
|
|
412
428
|
|
|
413
429
|
/* typography */
|
|
430
|
+
--course-outline-item-title-font-family:
|
|
431
|
+
var(--font-lead-family);
|
|
432
|
+
--course-outline-item-title-font-size:
|
|
433
|
+
var(--font-lead);
|
|
434
|
+
--course-outline-item-title-font-weight:
|
|
435
|
+
var(--font-lead-weight);
|
|
436
|
+
--course-outline-item-title-line-height:
|
|
437
|
+
var(--font-lead-line);
|
|
438
|
+
--course-outline-item-title-letter-spacing:
|
|
439
|
+
var(--font-lead-letter-spacing);
|
|
440
|
+
|
|
441
|
+
--course-outline-body-font-family:
|
|
442
|
+
var(--font-body-family);
|
|
443
|
+
--course-outline-body-font-size:
|
|
444
|
+
var(--font-body);
|
|
445
|
+
--course-outline-body-font-weight:
|
|
446
|
+
var(--font-body-weight);
|
|
447
|
+
--course-outline-body-line-height:
|
|
448
|
+
var(--font-body-line);
|
|
449
|
+
--course-outline-body-letter-spacing:
|
|
450
|
+
var(--font-body-letter-spacing);
|
|
451
|
+
|
|
452
|
+
--course-outline-note-font-family:
|
|
453
|
+
var(--font-body-family);
|
|
454
|
+
--course-outline-note-font-size:
|
|
455
|
+
var(--font-note);
|
|
456
|
+
--course-outline-note-font-weight:
|
|
457
|
+
var(--font-note-weight);
|
|
458
|
+
--course-outline-note-line-height:
|
|
459
|
+
var(--font-note-line);
|
|
460
|
+
--course-outline-note-letter-spacing:
|
|
461
|
+
var(--font-note-letter-spacing);
|
|
414
462
|
|
|
415
463
|
/* size */
|
|
464
|
+
--course-outline-item-content-gap:
|
|
465
|
+
var(--margin-descriptor);
|
|
466
|
+
--course-outline-details-gap:
|
|
467
|
+
var(--font-body-margin);
|
|
468
|
+
|
|
416
469
|
display: flex;
|
|
417
470
|
flex-direction: column;
|
|
418
471
|
align-items: flex-start;
|
|
@@ -11,6 +11,9 @@ export interface CourseOutlineItem {
|
|
|
11
11
|
active?: boolean;
|
|
12
12
|
disabled?: boolean;
|
|
13
13
|
}
|
|
14
|
+
export interface CourseOutlineItemProps {
|
|
15
|
+
item: CourseOutlineItem;
|
|
16
|
+
}
|
|
14
17
|
export interface CourseOutlineGroup {
|
|
15
18
|
id: React.Key;
|
|
16
19
|
title: React.ReactNode;
|
|
@@ -23,5 +26,6 @@ export interface CourseOutlineProps extends Omit<React.HTMLAttributes<HTMLDivEle
|
|
|
23
26
|
headingLevel?: CourseOutlineHeadingLevel;
|
|
24
27
|
collapsible?: boolean;
|
|
25
28
|
}
|
|
29
|
+
export declare const CourseOutlineItem: React.FC<CourseOutlineItemProps>;
|
|
26
30
|
declare const CourseOutline: React.FC<CourseOutlineProps>;
|
|
27
31
|
export default CourseOutline;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import './course-outline.css';
|
|
4
4
|
import { classnames } from '../helpers/classnames';
|
|
@@ -23,6 +23,41 @@ function getItemTitle(item) {
|
|
|
23
23
|
}
|
|
24
24
|
return hasContent(item.link) ? item.link : item.title;
|
|
25
25
|
}
|
|
26
|
+
function getItemClasses(item) {
|
|
27
|
+
return classnames(
|
|
28
|
+
"course-outline__item",
|
|
29
|
+
"",
|
|
30
|
+
{
|
|
31
|
+
"course-outline__item--active": Boolean(
|
|
32
|
+
item.active
|
|
33
|
+
),
|
|
34
|
+
"course-outline__item--disabled": Boolean(
|
|
35
|
+
item.disabled
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
const CourseOutlineItem = ({ item }) => {
|
|
41
|
+
const hasMeta = hasContent(item.meta);
|
|
42
|
+
const hasStatus = hasContent(item.status);
|
|
43
|
+
const hasAction = hasContent(item.action);
|
|
44
|
+
const hasFooter = hasStatus || hasAction;
|
|
45
|
+
return /* @__PURE__ */ jsxs(
|
|
46
|
+
"article",
|
|
47
|
+
{
|
|
48
|
+
className: "course-outline__item-body",
|
|
49
|
+
"aria-disabled": item.disabled ? "true" : void 0,
|
|
50
|
+
children: [
|
|
51
|
+
/* @__PURE__ */ jsx("div", { className: "course-outline__title", children: getItemTitle(item) }),
|
|
52
|
+
hasMeta && /* @__PURE__ */ jsx("div", { className: "course-outline__meta", children: item.meta }),
|
|
53
|
+
hasFooter && /* @__PURE__ */ jsxs("div", { className: "course-outline__footer", children: [
|
|
54
|
+
hasStatus && /* @__PURE__ */ jsx("div", { className: "course-outline__status", children: item.status }),
|
|
55
|
+
hasAction && /* @__PURE__ */ jsx("div", { className: "course-outline__action", children: item.action })
|
|
56
|
+
] })
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
};
|
|
26
61
|
const GroupTitle = ({
|
|
27
62
|
level,
|
|
28
63
|
children
|
|
@@ -133,46 +168,21 @@ const CourseOutline = ({
|
|
|
133
168
|
className: "course-outline__items",
|
|
134
169
|
id: groupContentId,
|
|
135
170
|
hidden: isCollapsed,
|
|
136
|
-
children: group.items.map((item) =>
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
}
|
|
152
|
-
);
|
|
153
|
-
return /* @__PURE__ */ jsx(
|
|
154
|
-
"li",
|
|
155
|
-
{
|
|
156
|
-
className: itemClasses,
|
|
157
|
-
children: /* @__PURE__ */ jsxs(
|
|
158
|
-
"article",
|
|
159
|
-
{
|
|
160
|
-
className: "course-outline__item-body",
|
|
161
|
-
"aria-disabled": item.disabled ? "true" : void 0,
|
|
162
|
-
children: [
|
|
163
|
-
/* @__PURE__ */ jsx("div", { className: "course-outline__title", children: getItemTitle(item) }),
|
|
164
|
-
hasMeta && /* @__PURE__ */ jsx("div", { className: "course-outline__meta", children: item.meta }),
|
|
165
|
-
hasFooter && /* @__PURE__ */ jsxs("div", { className: "course-outline__footer", children: [
|
|
166
|
-
hasStatus && /* @__PURE__ */ jsx("div", { className: "course-outline__status", children: item.status }),
|
|
167
|
-
hasAction && /* @__PURE__ */ jsx("div", { className: "course-outline__action", children: item.action })
|
|
168
|
-
] })
|
|
169
|
-
]
|
|
170
|
-
}
|
|
171
|
-
)
|
|
172
|
-
},
|
|
173
|
-
item.id
|
|
174
|
-
);
|
|
175
|
-
})
|
|
171
|
+
children: group.items.map((item) => /* @__PURE__ */ jsx(
|
|
172
|
+
"li",
|
|
173
|
+
{
|
|
174
|
+
className: getItemClasses(
|
|
175
|
+
item
|
|
176
|
+
),
|
|
177
|
+
children: /* @__PURE__ */ jsx(
|
|
178
|
+
CourseOutlineItem,
|
|
179
|
+
{
|
|
180
|
+
item
|
|
181
|
+
}
|
|
182
|
+
)
|
|
183
|
+
},
|
|
184
|
+
item.id
|
|
185
|
+
))
|
|
176
186
|
}
|
|
177
187
|
)
|
|
178
188
|
]
|
|
@@ -185,6 +195,6 @@ const CourseOutline = ({
|
|
|
185
195
|
};
|
|
186
196
|
var course_outline_default = CourseOutline;
|
|
187
197
|
|
|
188
|
-
export { course_outline_default as default };
|
|
198
|
+
export { CourseOutlineItem, course_outline_default as default };
|
|
189
199
|
//# sourceMappingURL=course-outline.js.map
|
|
190
200
|
//# sourceMappingURL=course-outline.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/course-outline/course-outline.tsx"],"names":[],"mappings":"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","file":"course-outline.js","sourcesContent":["import React from 'react';\n\nimport './course-outline.css';\nimport { classnames } from '../helpers/classnames';\n\nexport type CourseOutlineHeadingLevel =\n | 2\n | 3\n | 4\n | 5\n | 6;\n\nexport interface CourseOutlineItem {\n id: React.Key;\n title: React.ReactNode;\n link?: React.ReactNode;\n meta?: React.ReactNode;\n status?: React.ReactNode;\n action?: React.ReactNode;\n active?: boolean;\n disabled?: boolean;\n}\n\nexport interface CourseOutlineGroup {\n id: React.Key;\n title: React.ReactNode;\n description?: React.ReactNode;\n items: CourseOutlineItem[];\n defaultCollapsed?: boolean;\n}\n\nexport interface CourseOutlineProps\n extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n > {\n groups: CourseOutlineGroup[];\n headingLevel?: CourseOutlineHeadingLevel;\n collapsible?: boolean;\n}\n\ntype CollapsedGroups = Map<React.Key, boolean>;\n\nfunction hasContent(\n value: React.ReactNode,\n): value is Exclude<\n React.ReactNode,\n null | undefined\n> {\n return value !== null && value !== undefined;\n}\n\nfunction getInitialCollapsedGroups(\n groups: CourseOutlineGroup[],\n): CollapsedGroups {\n return new Map(\n groups.map((group) => [\n group.id,\n Boolean(group.defaultCollapsed),\n ]),\n );\n}\n\nfunction getGroupCollapsed(\n collapsedGroups: CollapsedGroups,\n group: CourseOutlineGroup,\n) {\n return (\n collapsedGroups.get(group.id) ??\n Boolean(group.defaultCollapsed)\n );\n}\n\nfunction getItemTitle(\n item: CourseOutlineItem,\n): React.ReactNode {\n if (item.active) {\n return item.title;\n }\n\n return hasContent(item.link)\n ? item.link\n : item.title;\n}\n\ninterface GroupTitleProps {\n level?: CourseOutlineHeadingLevel;\n children: React.ReactNode;\n}\n\nconst GroupTitle: React.FC<GroupTitleProps> = ({\n level,\n children,\n}) => {\n if (!level) {\n return (\n <div className=\"course-outline__group-title\">\n {children}\n </div>\n );\n }\n\n switch (level) {\n case 2:\n return (\n <h2 className=\"course-outline__group-title\">\n {children}\n </h2>\n );\n\n case 3:\n return (\n <h3 className=\"course-outline__group-title\">\n {children}\n </h3>\n );\n\n case 4:\n return (\n <h4 className=\"course-outline__group-title\">\n {children}\n </h4>\n );\n\n case 5:\n return (\n <h5 className=\"course-outline__group-title\">\n {children}\n </h5>\n );\n\n default:\n return (\n <h6 className=\"course-outline__group-title\">\n {children}\n </h6>\n );\n }\n};\n\nconst CourseOutline: React.FC<CourseOutlineProps> = ({\n groups,\n headingLevel,\n collapsible = false,\n className = '',\n ...props\n}) => {\n const visibleGroups = React.useMemo(\n () =>\n groups.filter(\n (group) => group.items.length > 0,\n ),\n [groups],\n );\n\n const [collapsedGroups, setCollapsedGroups] =\n React.useState<CollapsedGroups>(() =>\n getInitialCollapsedGroups(visibleGroups),\n );\n\n const componentId = React.useId();\n\n React.useEffect(() => {\n if (!collapsible) {\n return;\n }\n\n setCollapsedGroups((current) => {\n const next = new Map(current);\n let changed = false;\n\n for (const group of visibleGroups) {\n if (!next.has(group.id)) {\n next.set(\n group.id,\n Boolean(group.defaultCollapsed),\n );\n\n changed = true;\n }\n }\n\n return changed ? next : current;\n });\n }, [collapsible, visibleGroups]);\n\n if (visibleGroups.length === 0) {\n return null;\n }\n\n const classes = classnames(\n 'course-outline',\n className,\n {\n 'course-outline--collapsible': collapsible,\n },\n );\n\n const toggleGroup = (\n group: CourseOutlineGroup,\n ) => {\n setCollapsedGroups((current) => {\n const next = new Map(current);\n\n next.set(\n group.id,\n !getGroupCollapsed(current, group),\n );\n\n return next;\n });\n };\n\n return (\n <div\n className={classes}\n {...props}\n >\n <ol className=\"course-outline__groups\">\n {visibleGroups.map((group, groupIndex) => {\n const isCollapsed =\n collapsible &&\n getGroupCollapsed(\n collapsedGroups,\n group,\n );\n\n const groupContentId =\n `${componentId}-group-${groupIndex}`;\n\n return (\n <li\n key={group.id}\n className=\"course-outline__group\"\n >\n <header className=\"course-outline__group-header\">\n <GroupTitle level={headingLevel}>\n {collapsible ? (\n <button\n className=\"course-outline__group-toggle\"\n type=\"button\"\n aria-expanded={!isCollapsed}\n aria-controls={groupContentId}\n onClick={() => toggleGroup(group)}\n >\n {group.title}\n </button>\n ) : (\n group.title\n )}\n </GroupTitle>\n </header>\n\n {hasContent(group.description) && (\n <div className=\"course-outline__group-description\">\n {group.description}\n </div>\n )}\n\n <ol\n className=\"course-outline__items\"\n id={groupContentId}\n hidden={isCollapsed}\n >\n {group.items.map((item) => {\n const hasMeta = hasContent(item.meta);\n const hasStatus = hasContent(\n item.status,\n );\n const hasAction = hasContent(\n item.action,\n );\n\n const hasFooter =\n hasStatus || hasAction;\n\n const itemClasses = classnames(\n 'course-outline__item',\n '',\n {\n 'course-outline__item--active':\n Boolean(item.active),\n\n 'course-outline__item--disabled':\n Boolean(item.disabled),\n },\n );\n\n return (\n <li\n key={item.id}\n className={itemClasses}\n >\n <article\n className=\"course-outline__item-body\"\n aria-disabled={\n item.disabled\n ? 'true'\n : undefined\n }\n >\n <div className=\"course-outline__title\">\n {getItemTitle(item)}\n </div>\n\n {hasMeta && (\n <div className=\"course-outline__meta\">\n {item.meta}\n </div>\n )}\n\n {hasFooter && (\n <div className=\"course-outline__footer\">\n {hasStatus && (\n <div className=\"course-outline__status\">\n {item.status}\n </div>\n )}\n\n {hasAction && (\n <div className=\"course-outline__action\">\n {item.action}\n </div>\n )}\n </div>\n )}\n </article>\n </li>\n );\n })}\n </ol>\n </li>\n );\n })}\n </ol>\n </div>\n );\n};\n\nexport default CourseOutline;\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/course-outline/course-outline.tsx"],"names":[],"mappings":"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","file":"course-outline.js","sourcesContent":["import React from 'react';\n\nimport './course-outline.css';\nimport { classnames } from '../helpers/classnames';\n\nexport type CourseOutlineHeadingLevel =\n | 2\n | 3\n | 4\n | 5\n | 6;\n\nexport interface CourseOutlineItem {\n id: React.Key;\n title: React.ReactNode;\n link?: React.ReactNode;\n meta?: React.ReactNode;\n status?: React.ReactNode;\n action?: React.ReactNode;\n active?: boolean;\n disabled?: boolean;\n}\n\nexport interface CourseOutlineItemProps {\n item: CourseOutlineItem;\n}\n\nexport interface CourseOutlineGroup {\n id: React.Key;\n title: React.ReactNode;\n description?: React.ReactNode;\n items: CourseOutlineItem[];\n defaultCollapsed?: boolean;\n}\n\nexport interface CourseOutlineProps\n extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'children'\n > {\n groups: CourseOutlineGroup[];\n headingLevel?: CourseOutlineHeadingLevel;\n collapsible?: boolean;\n}\n\ntype CollapsedGroups = Map<React.Key, boolean>;\n\nfunction hasContent(\n value: React.ReactNode,\n): value is Exclude<\n React.ReactNode,\n null | undefined\n> {\n return value !== null && value !== undefined;\n}\n\nfunction getInitialCollapsedGroups(\n groups: CourseOutlineGroup[],\n): CollapsedGroups {\n return new Map(\n groups.map((group) => [\n group.id,\n Boolean(group.defaultCollapsed),\n ]),\n );\n}\n\nfunction getGroupCollapsed(\n collapsedGroups: CollapsedGroups,\n group: CourseOutlineGroup,\n) {\n return (\n collapsedGroups.get(group.id) ??\n Boolean(group.defaultCollapsed)\n );\n}\n\nfunction getItemTitle(\n item: CourseOutlineItem,\n): React.ReactNode {\n if (item.active) {\n return item.title;\n }\n\n return hasContent(item.link)\n ? item.link\n : item.title;\n}\n\nfunction getItemClasses(\n item: CourseOutlineItem,\n) {\n return classnames(\n 'course-outline__item',\n '',\n {\n 'course-outline__item--active': Boolean(\n item.active,\n ),\n\n 'course-outline__item--disabled': Boolean(\n item.disabled,\n ),\n },\n );\n}\n\nexport const CourseOutlineItem: React.FC<\n CourseOutlineItemProps\n> = ({ item }) => {\n const hasMeta = hasContent(item.meta);\n const hasStatus = hasContent(item.status);\n const hasAction = hasContent(item.action);\n const hasFooter = hasStatus || hasAction;\n\n return (\n <article\n className=\"course-outline__item-body\"\n aria-disabled={\n item.disabled ? 'true' : undefined\n }\n >\n <div className=\"course-outline__title\">\n {getItemTitle(item)}\n </div>\n\n {hasMeta && (\n <div className=\"course-outline__meta\">\n {item.meta}\n </div>\n )}\n\n {hasFooter && (\n <div className=\"course-outline__footer\">\n {hasStatus && (\n <div className=\"course-outline__status\">\n {item.status}\n </div>\n )}\n\n {hasAction && (\n <div className=\"course-outline__action\">\n {item.action}\n </div>\n )}\n </div>\n )}\n </article>\n );\n};\n\ninterface GroupTitleProps {\n level?: CourseOutlineHeadingLevel;\n children: React.ReactNode;\n}\n\nconst GroupTitle: React.FC<GroupTitleProps> = ({\n level,\n children,\n}) => {\n if (!level) {\n return (\n <div className=\"course-outline__group-title\">\n {children}\n </div>\n );\n }\n\n switch (level) {\n case 2:\n return (\n <h2 className=\"course-outline__group-title\">\n {children}\n </h2>\n );\n\n case 3:\n return (\n <h3 className=\"course-outline__group-title\">\n {children}\n </h3>\n );\n\n case 4:\n return (\n <h4 className=\"course-outline__group-title\">\n {children}\n </h4>\n );\n\n case 5:\n return (\n <h5 className=\"course-outline__group-title\">\n {children}\n </h5>\n );\n\n default:\n return (\n <h6 className=\"course-outline__group-title\">\n {children}\n </h6>\n );\n }\n};\n\nconst CourseOutline: React.FC<CourseOutlineProps> = ({\n groups,\n headingLevel,\n collapsible = false,\n className = '',\n ...props\n}) => {\n const visibleGroups = React.useMemo(\n () =>\n groups.filter(\n (group) => group.items.length > 0,\n ),\n [groups],\n );\n\n const [collapsedGroups, setCollapsedGroups] =\n React.useState<CollapsedGroups>(() =>\n getInitialCollapsedGroups(visibleGroups),\n );\n\n const componentId = React.useId();\n\n React.useEffect(() => {\n if (!collapsible) {\n return;\n }\n\n setCollapsedGroups((current) => {\n const next = new Map(current);\n let changed = false;\n\n for (const group of visibleGroups) {\n if (!next.has(group.id)) {\n next.set(\n group.id,\n Boolean(group.defaultCollapsed),\n );\n\n changed = true;\n }\n }\n\n return changed ? next : current;\n });\n }, [collapsible, visibleGroups]);\n\n if (visibleGroups.length === 0) {\n return null;\n }\n\n const classes = classnames(\n 'course-outline',\n className,\n {\n 'course-outline--collapsible': collapsible,\n },\n );\n\n const toggleGroup = (\n group: CourseOutlineGroup,\n ) => {\n setCollapsedGroups((current) => {\n const next = new Map(current);\n\n next.set(\n group.id,\n !getGroupCollapsed(current, group),\n );\n\n return next;\n });\n };\n\n return (\n <div\n className={classes}\n {...props}\n >\n <ol className=\"course-outline__groups\">\n {visibleGroups.map((group, groupIndex) => {\n const isCollapsed =\n collapsible &&\n getGroupCollapsed(\n collapsedGroups,\n group,\n );\n\n const groupContentId =\n `${componentId}-group-${groupIndex}`;\n\n return (\n <li\n key={group.id}\n className=\"course-outline__group\"\n >\n <header className=\"course-outline__group-header\">\n <GroupTitle level={headingLevel}>\n {collapsible ? (\n <button\n className=\"course-outline__group-toggle\"\n type=\"button\"\n aria-expanded={!isCollapsed}\n aria-controls={groupContentId}\n onClick={() => toggleGroup(group)}\n >\n {group.title}\n </button>\n ) : (\n group.title\n )}\n </GroupTitle>\n </header>\n\n {hasContent(group.description) && (\n <div className=\"course-outline__group-description\">\n {group.description}\n </div>\n )}\n\n <ol\n className=\"course-outline__items\"\n id={groupContentId}\n hidden={isCollapsed}\n >\n {group.items.map((item) => (\n <li\n key={item.id}\n className={getItemClasses(\n item,\n )}\n >\n <CourseOutlineItem\n item={item}\n />\n </li>\n ))}\n </ol>\n </li>\n );\n })}\n </ol>\n </div>\n );\n};\n\nexport default CourseOutline;\n"]}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
3
5
|
var courseOutline = require('./course-outline');
|
|
4
6
|
|
|
5
7
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -8,6 +10,13 @@ var courseOutline__default = /*#__PURE__*/_interopDefault(courseOutline);
|
|
|
8
10
|
|
|
9
11
|
|
|
10
12
|
|
|
11
|
-
|
|
13
|
+
Object.defineProperty(exports, "CourseOutlineItem", {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
get: function () { return courseOutline.CourseOutlineItem; }
|
|
16
|
+
});
|
|
17
|
+
Object.defineProperty(exports, "default", {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
get: function () { return courseOutline__default.default; }
|
|
20
|
+
});
|
|
12
21
|
//# sourceMappingURL=index.cjs.map
|
|
13
22
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { default } from './course-outline';
|
|
2
|
-
export type { CourseOutlineGroup, CourseOutlineHeadingLevel,
|
|
1
|
+
export { default, CourseOutlineItem, } from './course-outline';
|
|
2
|
+
export type { CourseOutlineGroup, CourseOutlineHeadingLevel, CourseOutlineItemProps, CourseOutlineProps, } from './course-outline';
|
package/components/index.cjs
CHANGED
|
@@ -189,6 +189,10 @@ Object.defineProperty(exports, "CourseOutline", {
|
|
|
189
189
|
enumerable: true,
|
|
190
190
|
get: function () { return courseOutline__default.default; }
|
|
191
191
|
});
|
|
192
|
+
Object.defineProperty(exports, "CourseOutlineItem", {
|
|
193
|
+
enumerable: true,
|
|
194
|
+
get: function () { return courseOutline.CourseOutlineItem; }
|
|
195
|
+
});
|
|
192
196
|
Object.defineProperty(exports, "FlipList", {
|
|
193
197
|
enumerable: true,
|
|
194
198
|
get: function () { return flipList__default.default; }
|
package/components/index.d.ts
CHANGED
|
@@ -53,8 +53,8 @@ export { default as Markdown } from './markdown/markdown';
|
|
|
53
53
|
export type { MarkdownEmbed, MarkdownLinkProps, MarkdownProps, } from './markdown/markdown';
|
|
54
54
|
export { default as Discussion } from './discussion/discussion';
|
|
55
55
|
export type { DiscussionItem, DiscussionProps, } from './discussion/discussion';
|
|
56
|
-
export { default as CourseOutline } from './course-outline/course-outline';
|
|
57
|
-
export type { CourseOutlineGroup, CourseOutlineHeadingLevel,
|
|
56
|
+
export { default as CourseOutline, CourseOutlineItem, } from './course-outline/course-outline';
|
|
57
|
+
export type { CourseOutlineGroup, CourseOutlineHeadingLevel, CourseOutlineItemProps, CourseOutlineProps, } from './course-outline/course-outline';
|
|
58
58
|
export * from './calendar-month';
|
|
59
59
|
export { default as FlipList } from './flip-list/flip-list';
|
|
60
60
|
export type { FlipListItem, FlipListProps, } from './flip-list/flip-list';
|
package/components/index.js
CHANGED
|
@@ -25,7 +25,7 @@ export { default as CardGroup } from './card-group/card-group';
|
|
|
25
25
|
export { default as Breadcrumbs } from './breadcrumbs/breadcrumbs';
|
|
26
26
|
export { default as Markdown } from './markdown/markdown';
|
|
27
27
|
export { default as Discussion } from './discussion/discussion';
|
|
28
|
-
export { default as CourseOutline } from './course-outline/course-outline';
|
|
28
|
+
export { default as CourseOutline, CourseOutlineItem } from './course-outline/course-outline';
|
|
29
29
|
export * from './calendar-month';
|
|
30
30
|
export { default as FlipList } from './flip-list/flip-list';
|
|
31
31
|
export { default as AvatarUpload } from './avatar-upload/avatar-upload';
|
package/index.cjs
CHANGED
|
@@ -223,6 +223,10 @@ Object.defineProperty(exports, "CourseOutline", {
|
|
|
223
223
|
enumerable: true,
|
|
224
224
|
get: function () { return courseOutline__default.default; }
|
|
225
225
|
});
|
|
226
|
+
Object.defineProperty(exports, "CourseOutlineItem", {
|
|
227
|
+
enumerable: true,
|
|
228
|
+
get: function () { return courseOutline.CourseOutlineItem; }
|
|
229
|
+
});
|
|
226
230
|
Object.defineProperty(exports, "FlipList", {
|
|
227
231
|
enumerable: true,
|
|
228
232
|
get: function () { return flipList__default.default; }
|
package/index.d.ts
CHANGED
|
@@ -61,8 +61,8 @@ export { default as Markdown } from './components/markdown';
|
|
|
61
61
|
export type { MarkdownEmbed, MarkdownLinkProps, MarkdownProps, } from './components/markdown';
|
|
62
62
|
export { default as Discussion } from './components/discussion';
|
|
63
63
|
export type { DiscussionItem, DiscussionProps, } from './components/discussion';
|
|
64
|
-
export { default as CourseOutline } from './components/course-outline';
|
|
65
|
-
export type { CourseOutlineGroup, CourseOutlineHeadingLevel,
|
|
64
|
+
export { default as CourseOutline, CourseOutlineItem, } from './components/course-outline';
|
|
65
|
+
export type { CourseOutlineGroup, CourseOutlineHeadingLevel, CourseOutlineItemProps, CourseOutlineProps, } from './components/course-outline';
|
|
66
66
|
export * from './components/calendar-month';
|
|
67
67
|
export { default as FlipList } from './components/flip-list';
|
|
68
68
|
export type { FlipListItem, FlipListProps, } from './components/flip-list';
|
package/index.js
CHANGED
|
@@ -27,7 +27,7 @@ export { default as CardGroup } from './components/card-group';
|
|
|
27
27
|
export { default as Breadcrumbs } from './components/breadcrumbs';
|
|
28
28
|
export { default as Markdown } from './components/markdown';
|
|
29
29
|
export { default as Discussion } from './components/discussion';
|
|
30
|
-
export { default as CourseOutline } from './components/course-outline';
|
|
30
|
+
export { default as CourseOutline, CourseOutlineItem } from './components/course-outline';
|
|
31
31
|
export * from './components/calendar-month';
|
|
32
32
|
export { default as FlipList } from './components/flip-list';
|
|
33
33
|
export { default as AvatarUpload } from './components/avatar-upload';
|
package/package.json
CHANGED
package/styles.css
CHANGED
|
@@ -1728,6 +1728,23 @@
|
|
|
1728
1728
|
.layout-sidebar__side .course-outline {
|
|
1729
1729
|
/* color */
|
|
1730
1730
|
|
|
1731
|
+
/* typography */
|
|
1732
|
+
|
|
1733
|
+
/* size */
|
|
1734
|
+
--course-outline-group-gap:
|
|
1735
|
+
var(--margin-item);
|
|
1736
|
+
|
|
1737
|
+
/* border */
|
|
1738
|
+
|
|
1739
|
+
/* depth */
|
|
1740
|
+
|
|
1741
|
+
/* motion */
|
|
1742
|
+
}
|
|
1743
|
+
|
|
1744
|
+
.layout-sidebar__side
|
|
1745
|
+
.course-outline__item-body {
|
|
1746
|
+
/* color */
|
|
1747
|
+
|
|
1731
1748
|
/* typography */
|
|
1732
1749
|
--course-outline-item-title-font-family:
|
|
1733
1750
|
var(--font-body-family);
|
|
@@ -1741,8 +1758,6 @@
|
|
|
1741
1758
|
var(--font-body-letter-spacing);
|
|
1742
1759
|
|
|
1743
1760
|
/* size */
|
|
1744
|
-
--course-outline-group-gap:
|
|
1745
|
-
var(--margin-item);
|
|
1746
1761
|
|
|
1747
1762
|
/* border */
|
|
1748
1763
|
|
|
@@ -1753,7 +1768,7 @@
|
|
|
1753
1768
|
|
|
1754
1769
|
.layout-sidebar__side
|
|
1755
1770
|
.course-outline__action,
|
|
1756
|
-
.layout-sidebar__side
|
|
1771
|
+
.layout-sidebar__side
|
|
1757
1772
|
.course-outline__meta {
|
|
1758
1773
|
/* color */
|
|
1759
1774
|
|
|
@@ -2060,10 +2075,48 @@ h4.course-outline__group-title {
|
|
|
2060
2075
|
|
|
2061
2076
|
.course-outline__item-body {
|
|
2062
2077
|
/* color */
|
|
2078
|
+
--course-outline-meta-color: var(--color-text-note);
|
|
2063
2079
|
|
|
2064
2080
|
/* typography */
|
|
2081
|
+
--course-outline-item-title-font-family:
|
|
2082
|
+
var(--font-lead-family);
|
|
2083
|
+
--course-outline-item-title-font-size:
|
|
2084
|
+
var(--font-lead);
|
|
2085
|
+
--course-outline-item-title-font-weight:
|
|
2086
|
+
var(--font-lead-weight);
|
|
2087
|
+
--course-outline-item-title-line-height:
|
|
2088
|
+
var(--font-lead-line);
|
|
2089
|
+
--course-outline-item-title-letter-spacing:
|
|
2090
|
+
var(--font-lead-letter-spacing);
|
|
2091
|
+
|
|
2092
|
+
--course-outline-body-font-family:
|
|
2093
|
+
var(--font-body-family);
|
|
2094
|
+
--course-outline-body-font-size:
|
|
2095
|
+
var(--font-body);
|
|
2096
|
+
--course-outline-body-font-weight:
|
|
2097
|
+
var(--font-body-weight);
|
|
2098
|
+
--course-outline-body-line-height:
|
|
2099
|
+
var(--font-body-line);
|
|
2100
|
+
--course-outline-body-letter-spacing:
|
|
2101
|
+
var(--font-body-letter-spacing);
|
|
2102
|
+
|
|
2103
|
+
--course-outline-note-font-family:
|
|
2104
|
+
var(--font-body-family);
|
|
2105
|
+
--course-outline-note-font-size:
|
|
2106
|
+
var(--font-note);
|
|
2107
|
+
--course-outline-note-font-weight:
|
|
2108
|
+
var(--font-note-weight);
|
|
2109
|
+
--course-outline-note-line-height:
|
|
2110
|
+
var(--font-note-line);
|
|
2111
|
+
--course-outline-note-letter-spacing:
|
|
2112
|
+
var(--font-note-letter-spacing);
|
|
2065
2113
|
|
|
2066
2114
|
/* size */
|
|
2115
|
+
--course-outline-item-content-gap:
|
|
2116
|
+
var(--margin-descriptor);
|
|
2117
|
+
--course-outline-details-gap:
|
|
2118
|
+
var(--font-body-margin);
|
|
2119
|
+
|
|
2067
2120
|
display: flex;
|
|
2068
2121
|
flex-direction: column;
|
|
2069
2122
|
align-items: flex-start;
|