canvas-design-mcp 0.9.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.
- package/CLAUDE.md +200 -0
- package/DESIGN.md +288 -0
- package/PROFESSOR-INSTRUCTIONS.txt +131 -0
- package/README.md +250 -0
- package/dist/canvas-api.d.ts +24 -0
- package/dist/canvas-api.d.ts.map +1 -0
- package/dist/canvas-api.js +146 -0
- package/dist/canvas-api.js.map +1 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +22 -0
- package/dist/config.js.map +1 -0
- package/dist/design-engine.d.ts +5 -0
- package/dist/design-engine.d.ts.map +1 -0
- package/dist/design-engine.js +23 -0
- package/dist/design-engine.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +567 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/accessibility.d.ts +7 -0
- package/dist/tools/accessibility.d.ts.map +1 -0
- package/dist/tools/accessibility.js +149 -0
- package/dist/tools/accessibility.js.map +1 -0
- package/dist/tools/contrast.d.ts +2 -0
- package/dist/tools/contrast.d.ts.map +1 -0
- package/dist/tools/contrast.js +7 -0
- package/dist/tools/contrast.js.map +1 -0
- package/dist/tools/critique.d.ts +23 -0
- package/dist/tools/critique.d.ts.map +1 -0
- package/dist/tools/critique.js +194 -0
- package/dist/tools/critique.js.map +1 -0
- package/dist/tools/generate.d.ts +18 -0
- package/dist/tools/generate.d.ts.map +1 -0
- package/dist/tools/generate.js +101 -0
- package/dist/tools/generate.js.map +1 -0
- package/dist/tools/gotchas.d.ts +7 -0
- package/dist/tools/gotchas.d.ts.map +1 -0
- package/dist/tools/gotchas.js +61 -0
- package/dist/tools/gotchas.js.map +1 -0
- package/dist/tools/ingest.d.ts +44 -0
- package/dist/tools/ingest.d.ts.map +1 -0
- package/dist/tools/ingest.js +211 -0
- package/dist/tools/ingest.js.map +1 -0
- package/dist/tools/list-courses.d.ts +16 -0
- package/dist/tools/list-courses.d.ts.map +1 -0
- package/dist/tools/list-courses.js +79 -0
- package/dist/tools/list-courses.js.map +1 -0
- package/dist/tools/page-io.d.ts +19 -0
- package/dist/tools/page-io.d.ts.map +1 -0
- package/dist/tools/page-io.js +77 -0
- package/dist/tools/page-io.js.map +1 -0
- package/dist/tools/panopto.d.ts +36 -0
- package/dist/tools/panopto.d.ts.map +1 -0
- package/dist/tools/panopto.js +188 -0
- package/dist/tools/panopto.js.map +1 -0
- package/dist/tools/personas.d.ts +21 -0
- package/dist/tools/personas.d.ts.map +1 -0
- package/dist/tools/personas.js +464 -0
- package/dist/tools/personas.js.map +1 -0
- package/dist/tools/philosophy.d.ts +21 -0
- package/dist/tools/philosophy.d.ts.map +1 -0
- package/dist/tools/philosophy.js +137 -0
- package/dist/tools/philosophy.js.map +1 -0
- package/dist/tools/publish.d.ts +31 -0
- package/dist/tools/publish.d.ts.map +1 -0
- package/dist/tools/publish.js +198 -0
- package/dist/tools/publish.js.map +1 -0
- package/dist/tools/redesign.d.ts +18 -0
- package/dist/tools/redesign.d.ts.map +1 -0
- package/dist/tools/redesign.js +68 -0
- package/dist/tools/redesign.js.map +1 -0
- package/dist/tools/update-kb.d.ts +10 -0
- package/dist/tools/update-kb.d.ts.map +1 -0
- package/dist/tools/update-kb.js +93 -0
- package/dist/tools/update-kb.js.map +1 -0
- package/dist/tools/validate.d.ts +10 -0
- package/dist/tools/validate.d.ts.map +1 -0
- package/dist/tools/validate.js +76 -0
- package/dist/tools/validate.js.map +1 -0
- package/dist/types.d.ts +65 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/wizard.d.ts +3 -0
- package/dist/wizard.d.ts.map +1 -0
- package/dist/wizard.js +229 -0
- package/dist/wizard.js.map +1 -0
- package/docs/canvas-design-kb/00-meta/Changelog.md +42 -0
- package/docs/canvas-design-kb/00-meta/Contributing.md +58 -0
- package/docs/canvas-design-kb/00-meta/KB-Overview.md +51 -0
- package/docs/canvas-design-kb/01-canvas-rce/CSS-Inline-Strategy.md +166 -0
- package/docs/canvas-design-kb/01-canvas-rce/Canvas-Built-In-CSS-Classes.md +243 -0
- package/docs/canvas-design-kb/01-canvas-rce/Canvas-Page-Types.md +59 -0
- package/docs/canvas-design-kb/01-canvas-rce/HTML-Allowlist.md +204 -0
- package/docs/canvas-design-kb/01-canvas-rce/RCE-Limitations-and-Workarounds.md +151 -0
- package/docs/canvas-design-kb/01-canvas-rce/RCE-Overview.md +92 -0
- package/docs/canvas-design-kb/02-design-md/DESIGN-MD-Canvas-Template.md +323 -0
- package/docs/canvas-design-kb/02-design-md/DESIGN-MD-File-Structure.md +245 -0
- package/docs/canvas-design-kb/02-design-md/DESIGN-MD-Overview.md +120 -0
- package/docs/canvas-design-kb/02-design-md/DESIGN-MD-Toolchain.md +234 -0
- package/docs/canvas-design-kb/03-design-systems/Color-and-Typography.md +146 -0
- package/docs/canvas-design-kb/03-design-systems/Component-Library.md +299 -0
- package/docs/canvas-design-kb/03-design-systems/Design-System-Principles.md +99 -0
- package/docs/canvas-design-kb/04-tools/Canvas-Theme-Editor.md +40 -0
- package/docs/canvas-design-kb/04-tools/Other-Canvas-Design-Tools.md +47 -0
- package/docs/canvas-design-kb/05-patterns/Course-Home-Page.md +224 -0
- package/docs/canvas-design-kb/06-accessibility/Accessibility-Overview.md +128 -0
- package/docs/canvas-design-kb/07-resources/Inspiration-and-Showcases.md +121 -0
- package/docs/canvas-design-kb/07-resources/Official-Canvas-Links.md +54 -0
- package/docs/canvas-design-kb/README.md +58 -0
- package/docs/feature-roadmap.md +123 -0
- package/docs/installation.md +340 -0
- package/package.json +45 -0
- package/scripts/deploy-public.ps1 +68 -0
- package/src/kb/design-principles.md +45 -0
- package/src/templates/ignite-assignment-page.html +203 -0
- package/src/templates/two-column-dashboard.html +33 -0
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
# Canvas Design Studio — Claude Code Instructions
|
|
2
|
+
|
|
3
|
+
## Project Purpose
|
|
4
|
+
|
|
5
|
+
This project is a **Canvas LMS HTML Design Studio** — a tool for generating, previewing, and managing rich HTML page templates for Canvas LMS courses.
|
|
6
|
+
|
|
7
|
+
The reference knowledge base in `docs/canvas-design-kb/` contains everything needed to generate valid, well-designed Canvas HTML. **Always consult it before generating any Canvas HTML.**
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## How to Use the Knowledge Base
|
|
12
|
+
|
|
13
|
+
The KB is in `docs/canvas-design-kb/`. Key files to read before doing Canvas-related work:
|
|
14
|
+
|
|
15
|
+
| Need | File to read |
|
|
16
|
+
|---|---|
|
|
17
|
+
| What CSS is allowed | `docs/canvas-design-kb/01-canvas-rce/HTML-Allowlist.md` |
|
|
18
|
+
| Canvas's built-in classes (grid, borders) | `docs/canvas-design-kb/01-canvas-rce/Canvas-Built-In-CSS-Classes.md` |
|
|
19
|
+
| What gets stripped by Canvas | `docs/canvas-design-kb/01-canvas-rce/RCE-Limitations-and-Workarounds.md` |
|
|
20
|
+
| Design tokens (colors, type, spacing) | `docs/canvas-design-kb/02-design-md/DESIGN-MD-Canvas-Template.md` |
|
|
21
|
+
| Ready-to-use HTML components | `docs/canvas-design-kb/03-design-systems/Component-Library.md` |
|
|
22
|
+
| Full home page template | `docs/canvas-design-kb/05-patterns/Course-Home-Page.md` |
|
|
23
|
+
| Accessibility rules | `docs/canvas-design-kb/06-accessibility/Accessibility-Overview.md` |
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Hard Rules for Canvas HTML Generation
|
|
28
|
+
|
|
29
|
+
These are non-negotiable constraints sourced from the Canvas RCE sanitizer. Violating them produces broken output.
|
|
30
|
+
|
|
31
|
+
1. **No `<style>` blocks** — all CSS must be inline `style=""` attributes
|
|
32
|
+
2. **No `<script>` tags** — no JavaScript
|
|
33
|
+
3. **No `box-shadow`** — stripped by Canvas
|
|
34
|
+
4. **No `filter`, `transform`, `transition`, `animation`, `opacity`** — all stripped
|
|
35
|
+
5. **No `gap`** in flex/grid — use `margin` on children OR use Canvas's built-in grid classes
|
|
36
|
+
6. **No `<h1>`** in body HTML — Canvas uses H1 for the page title; start at H2
|
|
37
|
+
7. **No `@font-face` or `@import`** — use `Lato, sans-serif`
|
|
38
|
+
8. **No event attributes** (`onclick`, `onload`, etc.)
|
|
39
|
+
9. `border-radius` **IS** allowed — use freely
|
|
40
|
+
10. `display: flex` and `display: grid` **ARE** allowed as shorthand
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Canvas Built-In CSS Classes (Use These for Layouts)
|
|
45
|
+
|
|
46
|
+
These classes come from Canvas's own stylesheet — no admin access needed:
|
|
47
|
+
|
|
48
|
+
```html
|
|
49
|
+
<!-- Responsive 2-column layout (stacks on mobile automatically) -->
|
|
50
|
+
<div class="content-box">
|
|
51
|
+
<div class="grid-row">
|
|
52
|
+
<div class="col-xs-12 col-md-6">Left column</div>
|
|
53
|
+
<div class="col-xs-12 col-md-6">Right column</div>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
<!-- Bordered rounded box -->
|
|
58
|
+
<div class="border border-trbl border-round" style="padding: 16px;">
|
|
59
|
+
Content
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<!-- Professional data table -->
|
|
63
|
+
<table class="ic-Table ic-Table--hover-row" style="width: 100%;">...</table>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Design Tokens
|
|
69
|
+
|
|
70
|
+
From `docs/canvas-design-kb/02-design-md/DESIGN-MD-Canvas-Template.md`:
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
Primary: #0033A0 (BSU blue — hero banners, active nav, primary buttons)
|
|
74
|
+
Primary-dark: #002277 (footer bars, hover states)
|
|
75
|
+
Primary-light: #E6ECF9 (callout backgrounds, light tints)
|
|
76
|
+
Neutral: #F4F3EF (page background, nav bar background)
|
|
77
|
+
Neutral-dark: #e0e0d8 (card borders)
|
|
78
|
+
Text-primary: #1A1A1A (body text)
|
|
79
|
+
Text-secondary: #555550 (muted text)
|
|
80
|
+
White: #ffffff (card backgrounds)
|
|
81
|
+
|
|
82
|
+
Info: bg #E6F1FB / text+border #185FA5
|
|
83
|
+
Success: bg #EAF3DE / text+border #3B6D11
|
|
84
|
+
Warning: bg #FAEEDA / text+border #854F0B
|
|
85
|
+
Danger: bg #FCEBEB / text+border #A32D2D
|
|
86
|
+
|
|
87
|
+
Border-radius: sm=4px md=8px lg=10px xl=14px pill=20px
|
|
88
|
+
Spacing: xs=4px sm=8px md=16px lg=24px xl=48px
|
|
89
|
+
Font: Lato, sans-serif
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Project Structure
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
canvas-design-studio/
|
|
98
|
+
├── CLAUDE.md ← This file (loaded every session)
|
|
99
|
+
├── DESIGN.md ← Canvas design system spec (for AI agent use)
|
|
100
|
+
├── docs/
|
|
101
|
+
│ └── canvas-design-kb/ ← Full reference KB (23 Markdown files)
|
|
102
|
+
│ ├── README.md ← KB map of content
|
|
103
|
+
│ ├── 01-canvas-rce/ ← RCE constraints and workarounds
|
|
104
|
+
│ ├── 02-design-md/ ← DESIGN.md spec and templates
|
|
105
|
+
│ ├── 03-design-systems/ ← Component library and design principles
|
|
106
|
+
│ ├── 04-tools/ ← Theme Editor, external Canvas design references
|
|
107
|
+
│ ├── 05-patterns/ ← Full page templates
|
|
108
|
+
│ ├── 06-accessibility/ ← WCAG 2.1 AA reference
|
|
109
|
+
│ └── 07-resources/ ← External links and showcases
|
|
110
|
+
├── src/
|
|
111
|
+
│ └── templates/ ← Generated HTML templates live here
|
|
112
|
+
└── output/ ← Final Canvas-ready HTML files
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Workflow for Generating Canvas HTML
|
|
118
|
+
|
|
119
|
+
1. Read the relevant KB file(s) for the page type
|
|
120
|
+
2. Apply design tokens from `DESIGN.md` or the KB template
|
|
121
|
+
3. Generate HTML using only allowed tags and CSS properties
|
|
122
|
+
4. Use `content-box` + `grid-row` + `col-*` classes for multi-column layouts
|
|
123
|
+
5. Verify: no `<style>` blocks, no `<script>`, no disallowed CSS properties
|
|
124
|
+
6. Check heading hierarchy (H2 → H3 → H4, never H1)
|
|
125
|
+
7. Verify every `<img>` has an `alt=""` attribute
|
|
126
|
+
8. Save output to `src/templates/` or `output/`
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## KB Update Policy
|
|
131
|
+
|
|
132
|
+
When Canvas changes its HTML allowlist:
|
|
133
|
+
1. Update the relevant file in `docs/canvas-design-kb/`
|
|
134
|
+
2. Add an entry to `docs/canvas-design-kb/00-meta/Changelog.md`
|
|
135
|
+
3. If the change affects `CLAUDE.md` (e.g., a new allowed/disallowed property), update it here too
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Ingest Workflow (Primary Entry Point for Professors)
|
|
140
|
+
|
|
141
|
+
When a professor wants to generate a Canvas page, they fill in the `ingest/` folder and give you a single prompt. **Always check `ingest/` before starting any page generation.**
|
|
142
|
+
|
|
143
|
+
### Ingest Folder
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
ingest/
|
|
147
|
+
├── course-config.md ← REQUIRED: course number, name, professor, semester
|
|
148
|
+
├── assignment-brief.md ← REQUIRED: raw assignment instructions (any format)
|
|
149
|
+
└── style-notes.md ← OPTIONAL: layout, tone, hero image, extra sections
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### How to Process an Ingest Request
|
|
153
|
+
|
|
154
|
+
When asked to "build a page from ingest/" or similar:
|
|
155
|
+
|
|
156
|
+
1. Read `ingest/course-config.md` — scan every field for unfilled placeholders (anything in `[brackets]` or left blank after the colon)
|
|
157
|
+
- If any required fields are unfilled (Institution, Professor, Course Number, Course Name, Assignment Number, Semester): ask the professor for all missing values in a single message — do not ask one at a time
|
|
158
|
+
- Once you have the answers, write them into `ingest/course-config.md` before proceeding
|
|
159
|
+
- Optional fields (Page Title, Tone) can remain blank — use project defaults
|
|
160
|
+
2. Read `ingest/assignment-brief.md` — this is the raw source content; rewrite it into polished, student-friendly copy
|
|
161
|
+
3. Read `ingest/style-notes.md` — apply any layout or tone preferences; use project defaults for anything left blank
|
|
162
|
+
4. Read the relevant KB file(s) for the page type
|
|
163
|
+
5. Generate the HTML using all Canvas hard rules and design tokens
|
|
164
|
+
6. Save to `output/[course-number]-[assignment-number]-page.html`
|
|
165
|
+
7. Report: what was built, the output filename, and the hero image prompt if one is needed
|
|
166
|
+
|
|
167
|
+
### The Prompt Professors Use
|
|
168
|
+
|
|
169
|
+
> "Read everything in `ingest/`, then generate a Canvas assignment page using the design system in this project. Save it to `output/`."
|
|
170
|
+
|
|
171
|
+
That's it. Everything else is derived from the ingest files and this CLAUDE.md.
|
|
172
|
+
|
|
173
|
+
### Hero Image
|
|
174
|
+
|
|
175
|
+
If `style-notes.md` requests a hero image (or if it's blank and the assignment warrants one), generate a ChatGPT image prompt tailored to the assignment topic and tell the professor:
|
|
176
|
+
- The prompt to use
|
|
177
|
+
- The required size (1200×400px)
|
|
178
|
+
- That they replace `HERO_IMAGE_URL` in the output file with the hosted image URL
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## Common Tasks
|
|
183
|
+
|
|
184
|
+
**"Build a page from ingest/"** *(most common)*
|
|
185
|
+
→ Read all three files in `ingest/`, then follow the Ingest Workflow section above.
|
|
186
|
+
|
|
187
|
+
**"Generate a course home page"**
|
|
188
|
+
→ Read `docs/canvas-design-kb/05-patterns/Course-Home-Page.md`, then generate with actual course content.
|
|
189
|
+
|
|
190
|
+
**"Add a callout box"**
|
|
191
|
+
→ Read `docs/canvas-design-kb/03-design-systems/Component-Library.md` section 3.
|
|
192
|
+
|
|
193
|
+
**"Make a two-column layout"**
|
|
194
|
+
→ Use `content-box` + `grid-row` + `col-xs-12 col-md-6` (Canvas built-in classes, no admin needed).
|
|
195
|
+
|
|
196
|
+
**"Check if a CSS property is allowed"**
|
|
197
|
+
→ Read `docs/canvas-design-kb/01-canvas-rce/HTML-Allowlist.md`.
|
|
198
|
+
|
|
199
|
+
**"Update the design system colors"**
|
|
200
|
+
→ Edit `DESIGN.md` and update the Design Tokens section above in this file.
|
package/DESIGN.md
ADDED
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Canvas Course Design System
|
|
3
|
+
version: "1.0"
|
|
4
|
+
target: Canvas LMS Rich Content Editor
|
|
5
|
+
colors:
|
|
6
|
+
primary: "#0033A0"
|
|
7
|
+
primary-dark: "#002277"
|
|
8
|
+
primary-light: "#E6ECF9"
|
|
9
|
+
secondary: "#D64309"
|
|
10
|
+
secondary-light: "#faeeda"
|
|
11
|
+
neutral: "#F4F3EF"
|
|
12
|
+
neutral-dark: "#e0e0d8"
|
|
13
|
+
text-primary: "#1A1A1A"
|
|
14
|
+
text-secondary: "#555550"
|
|
15
|
+
text-muted: "#888780"
|
|
16
|
+
white: "#ffffff"
|
|
17
|
+
info-bg: "#E6F1FB"
|
|
18
|
+
info-border: "#185FA5"
|
|
19
|
+
info-text: "#0C447C"
|
|
20
|
+
success-bg: "#EAF3DE"
|
|
21
|
+
success-border: "#3B6D11"
|
|
22
|
+
success-text: "#27500A"
|
|
23
|
+
warning-bg: "#FAEEDA"
|
|
24
|
+
warning-border: "#854F0B"
|
|
25
|
+
warning-text: "#633806"
|
|
26
|
+
danger-bg: "#FCEBEB"
|
|
27
|
+
danger-border: "#A32D2D"
|
|
28
|
+
danger-text: "#791F1F"
|
|
29
|
+
typography:
|
|
30
|
+
h2:
|
|
31
|
+
fontFamily: Lato, sans-serif
|
|
32
|
+
fontSize: 1.75rem
|
|
33
|
+
fontWeight: "600"
|
|
34
|
+
lineHeight: "1.2"
|
|
35
|
+
h3:
|
|
36
|
+
fontFamily: Lato, sans-serif
|
|
37
|
+
fontSize: 1.375rem
|
|
38
|
+
fontWeight: "600"
|
|
39
|
+
lineHeight: "1.2"
|
|
40
|
+
h4:
|
|
41
|
+
fontFamily: Lato, sans-serif
|
|
42
|
+
fontSize: 1.125rem
|
|
43
|
+
fontWeight: "600"
|
|
44
|
+
body:
|
|
45
|
+
fontFamily: Lato, sans-serif
|
|
46
|
+
fontSize: 1rem
|
|
47
|
+
lineHeight: "1.65"
|
|
48
|
+
fontWeight: "400"
|
|
49
|
+
small:
|
|
50
|
+
fontFamily: Lato, sans-serif
|
|
51
|
+
fontSize: 0.875rem
|
|
52
|
+
label:
|
|
53
|
+
fontFamily: Lato, sans-serif
|
|
54
|
+
fontSize: 0.6875rem
|
|
55
|
+
fontWeight: "600"
|
|
56
|
+
letterSpacing: "0.08em"
|
|
57
|
+
textTransform: uppercase
|
|
58
|
+
rounded:
|
|
59
|
+
sm: 4px
|
|
60
|
+
md: 8px
|
|
61
|
+
lg: 10px
|
|
62
|
+
xl: 14px
|
|
63
|
+
pill: 20px
|
|
64
|
+
spacing:
|
|
65
|
+
xs: 4px
|
|
66
|
+
sm: 8px
|
|
67
|
+
md: 16px
|
|
68
|
+
lg: 24px
|
|
69
|
+
xl: 48px
|
|
70
|
+
components:
|
|
71
|
+
card:
|
|
72
|
+
backgroundColor: "{colors.white}"
|
|
73
|
+
border: "1px solid {colors.neutral-dark}"
|
|
74
|
+
borderRadius: "{rounded.lg}"
|
|
75
|
+
padding: "{spacing.lg} 20px"
|
|
76
|
+
hero-banner:
|
|
77
|
+
background: "linear-gradient(135deg, {colors.primary-dark} 0%, {colors.primary} 60%, #1A5BCC 100%)"
|
|
78
|
+
color: "{colors.white}"
|
|
79
|
+
borderRadius: "{rounded.xl}"
|
|
80
|
+
padding: "48px"
|
|
81
|
+
callout-info:
|
|
82
|
+
backgroundColor: "{colors.info-bg}"
|
|
83
|
+
borderLeft: "3px solid {colors.info-border}"
|
|
84
|
+
borderRadius: "0 {rounded.md} {rounded.md} 0"
|
|
85
|
+
padding: "14px 18px"
|
|
86
|
+
labelColor: "{colors.info-text}"
|
|
87
|
+
textColor: "{colors.info-border}"
|
|
88
|
+
callout-success:
|
|
89
|
+
backgroundColor: "{colors.success-bg}"
|
|
90
|
+
borderLeft: "3px solid {colors.success-border}"
|
|
91
|
+
borderRadius: "0 {rounded.md} {rounded.md} 0"
|
|
92
|
+
padding: "14px 18px"
|
|
93
|
+
labelColor: "{colors.success-text}"
|
|
94
|
+
textColor: "{colors.success-border}"
|
|
95
|
+
callout-warning:
|
|
96
|
+
backgroundColor: "{colors.warning-bg}"
|
|
97
|
+
borderLeft: "3px solid {colors.warning-border}"
|
|
98
|
+
borderRadius: "0 {rounded.md} {rounded.md} 0"
|
|
99
|
+
padding: "14px 18px"
|
|
100
|
+
labelColor: "{colors.warning-text}"
|
|
101
|
+
textColor: "{colors.warning-border}"
|
|
102
|
+
callout-danger:
|
|
103
|
+
backgroundColor: "{colors.danger-bg}"
|
|
104
|
+
borderLeft: "3px solid {colors.danger-border}"
|
|
105
|
+
borderRadius: "0 {rounded.md} {rounded.md} 0"
|
|
106
|
+
padding: "14px 18px"
|
|
107
|
+
labelColor: "{colors.danger-text}"
|
|
108
|
+
textColor: "{colors.danger-border}"
|
|
109
|
+
button-primary:
|
|
110
|
+
backgroundColor: "{colors.primary}"
|
|
111
|
+
color: "{colors.white}"
|
|
112
|
+
borderRadius: "{rounded.md}"
|
|
113
|
+
padding: "10px 22px"
|
|
114
|
+
fontWeight: "600"
|
|
115
|
+
fontSize: 0.875rem
|
|
116
|
+
textDecoration: none
|
|
117
|
+
display: inline-block
|
|
118
|
+
button-ghost:
|
|
119
|
+
border: "1.5px solid rgba(255,255,255,0.5)"
|
|
120
|
+
color: "{colors.white}"
|
|
121
|
+
borderRadius: "{rounded.md}"
|
|
122
|
+
padding: "9px 22px"
|
|
123
|
+
fontWeight: "500"
|
|
124
|
+
fontSize: 0.875rem
|
|
125
|
+
textDecoration: none
|
|
126
|
+
display: inline-block
|
|
127
|
+
button-outline:
|
|
128
|
+
border: "1.5px solid {colors.primary}"
|
|
129
|
+
color: "{colors.primary}"
|
|
130
|
+
borderRadius: "{rounded.md}"
|
|
131
|
+
padding: "9px 22px"
|
|
132
|
+
fontWeight: "500"
|
|
133
|
+
fontSize: 0.875rem
|
|
134
|
+
textDecoration: none
|
|
135
|
+
display: inline-block
|
|
136
|
+
pill-success:
|
|
137
|
+
backgroundColor: "{colors.success-bg}"
|
|
138
|
+
color: "{colors.success-border}"
|
|
139
|
+
borderRadius: "{rounded.pill}"
|
|
140
|
+
padding: "3px 10px"
|
|
141
|
+
fontSize: 0.6875rem
|
|
142
|
+
fontWeight: "600"
|
|
143
|
+
pill-info:
|
|
144
|
+
backgroundColor: "{colors.info-bg}"
|
|
145
|
+
color: "{colors.info-border}"
|
|
146
|
+
borderRadius: "{rounded.pill}"
|
|
147
|
+
padding: "3px 10px"
|
|
148
|
+
fontSize: 0.6875rem
|
|
149
|
+
fontWeight: "600"
|
|
150
|
+
pill-warning:
|
|
151
|
+
backgroundColor: "{colors.warning-bg}"
|
|
152
|
+
color: "{colors.warning-border}"
|
|
153
|
+
borderRadius: "{rounded.pill}"
|
|
154
|
+
padding: "3px 10px"
|
|
155
|
+
fontSize: 0.6875rem
|
|
156
|
+
fontWeight: "600"
|
|
157
|
+
pill-danger:
|
|
158
|
+
backgroundColor: "{colors.danger-bg}"
|
|
159
|
+
color: "{colors.danger-border}"
|
|
160
|
+
borderRadius: "{rounded.pill}"
|
|
161
|
+
padding: "3px 10px"
|
|
162
|
+
fontSize: 0.6875rem
|
|
163
|
+
fontWeight: "600"
|
|
164
|
+
footer-bar:
|
|
165
|
+
backgroundColor: "{colors.primary-dark}"
|
|
166
|
+
borderRadius: "{rounded.lg}"
|
|
167
|
+
padding: "20px 28px"
|
|
168
|
+
color: "rgba(255,255,255,0.75)"
|
|
169
|
+
linkColor: "#7BA7E0"
|
|
170
|
+
week-row-complete:
|
|
171
|
+
borderColor: "{colors.neutral-dark}"
|
|
172
|
+
stripColor: "{colors.primary}"
|
|
173
|
+
week-row-current:
|
|
174
|
+
borderColor: "{colors.primary}"
|
|
175
|
+
borderWidth: "2px"
|
|
176
|
+
stripColor: "{colors.primary}"
|
|
177
|
+
week-row-upcoming:
|
|
178
|
+
borderColor: "{colors.neutral-dark}"
|
|
179
|
+
stripColor: "#b4b2a9"
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## Overview
|
|
183
|
+
|
|
184
|
+
Professional academic design for active learners in business and technology programs. Clean, modern, and content-forward. The visual language reduces cognitive load through consistent component patterns across all course pages.
|
|
185
|
+
|
|
186
|
+
Tone: structured but human. Not cold corporate, not casual chaotic. Think "thoughtful faculty who cares about the student experience." The design should feel like a well-run tech company's internal learning platform — not a textbook, not a startup's marketing page.
|
|
187
|
+
|
|
188
|
+
## Colors
|
|
189
|
+
|
|
190
|
+
The palette is anchored by BSU's institutional blue (primary) with warm neutral backgrounds and semantic accent colors.
|
|
191
|
+
|
|
192
|
+
- **Primary (#0033A0):** BSU blue. Hero banners, section labels, active nav states, left-border callout accents, primary CTA buttons, and the week-row color strip. Contrast on white: 7.2:1 (passes WCAG AA).
|
|
193
|
+
- **Primary-dark (#002277):** Footer bars, hover states, text on primary-light backgrounds.
|
|
194
|
+
- **Primary-light (#E6ECF9):** Light blue tint for info/tip callout backgrounds.
|
|
195
|
+
- **Neutral (#F4F3EF):** Warm off-white page background. All cards sit on this.
|
|
196
|
+
- **White (#ffffff):** Card fill. Provides contrast against the neutral page background.
|
|
197
|
+
- **Text-primary (#1A1A1A):** Near-black body text. Softer than pure black on screens.
|
|
198
|
+
- **Semantic pairs:** Info (blue), success (green), warning (amber), danger (red). Always used as a light background + darker text/border pair. Never swap the pair.
|
|
199
|
+
|
|
200
|
+
**Canvas constraint:** `box-shadow` is not allowed in the RCE. Depth is achieved through background contrast (white card on neutral page) and border outlines only.
|
|
201
|
+
|
|
202
|
+
## Typography
|
|
203
|
+
|
|
204
|
+
Canvas LMS at Boise State loads Lato via the institutional theme. Always declare `Lato, sans-serif` as the font stack.
|
|
205
|
+
|
|
206
|
+
**Canvas constraint:** `<h1>` is reserved for the page title. All content headings start at `<h2>`. Heading hierarchy: H2 → H3 → H4. Never skip levels.
|
|
207
|
+
|
|
208
|
+
**Minimum body font size:** 14px. Never go smaller in generated content.
|
|
209
|
+
|
|
210
|
+
## Layout
|
|
211
|
+
|
|
212
|
+
Canvas page content renders inside a ~860px max-width content area on desktop. Plan for ~680px effective content width in constrained contexts (e.g., sidebar-open views).
|
|
213
|
+
|
|
214
|
+
**Mobile is real.** Students frequently access Canvas on phones. All layouts must be functional in a single column. Preferred approach: use Canvas's built-in `content-box` + `grid-row` + `col-xs-12 col-md-*` classes, which handle breakpoints automatically.
|
|
215
|
+
|
|
216
|
+
**Column limits:** 1 column default; 2 for complementary pairs; 3 for card grids; never 4+ on layouts that need to work on phones.
|
|
217
|
+
|
|
218
|
+
**Spacing rhythm:** 24px between major sections. 16px internal padding. 8px for compact contexts.
|
|
219
|
+
|
|
220
|
+
## Elevation & Depth
|
|
221
|
+
|
|
222
|
+
No `box-shadow` in Canvas RCE. Depth through:
|
|
223
|
+
- **Background contrast:** White (#ffffff) cards on neutral (#F4F3EF) background
|
|
224
|
+
- **Border:** 1px solid #e0e0d8 outlines on cards
|
|
225
|
+
- **Color fill:** Hero banners use full primary gradient for top-of-page visual weight
|
|
226
|
+
- **Left-border accent:** 3–4px solid semantic color on callout left edge
|
|
227
|
+
|
|
228
|
+
## Shapes
|
|
229
|
+
|
|
230
|
+
- Cards: `border-radius: 10px`
|
|
231
|
+
- Hero banners: `border-radius: 14px`
|
|
232
|
+
- Buttons: `border-radius: 8px`
|
|
233
|
+
- Pills/tags: `border-radius: 20px`
|
|
234
|
+
- Callout left-border style: `border-radius: 0 8px 8px 0`
|
|
235
|
+
- Images: `border-radius: 8px`
|
|
236
|
+
|
|
237
|
+
## Components
|
|
238
|
+
|
|
239
|
+
**card:** White bg, 1px neutral border, 10px radius, 18–20px padding. Use for module features, resource items, activity descriptions.
|
|
240
|
+
|
|
241
|
+
**hero-banner:** Full-width primary gradient background, white text, 48px vertical padding, 14px radius. Use for course home page and module landing pages only. Never use for mid-page sections.
|
|
242
|
+
|
|
243
|
+
**callout boxes:** 3px left border + light semantic background + 0 radius on left, 8px on right. Always include a `<strong>` label as the first child. Four variants: info, success, warning, danger.
|
|
244
|
+
|
|
245
|
+
**week-row:** Full-width card with colored left strip (a narrow div with primary background). Three states: complete (muted green strip + complete pill), current (highlighted border + danger pill), upcoming (gray strip + warning pill).
|
|
246
|
+
|
|
247
|
+
**pill labels:** 11px uppercase, semantic color pair. Do not use for body content — only for status and category tagging.
|
|
248
|
+
|
|
249
|
+
**footer-bar:** Dark primary-dark (#002277) background, full width, 12px radius, flex layout for text + link.
|
|
250
|
+
|
|
251
|
+
**navigation bar:** Horizontal flex row of anchor links. Active state: primary background + white text. Inactive: neutral background + dark text. Pill-radius on all buttons.
|
|
252
|
+
|
|
253
|
+
## Agents
|
|
254
|
+
|
|
255
|
+
**Hard constraints for Canvas RCE — these are non-negotiable. Violating them produces broken output:**
|
|
256
|
+
|
|
257
|
+
1. No `<style>` blocks — all CSS must be `style=""` inline attributes
|
|
258
|
+
2. No `<script>` tags — no JavaScript of any kind
|
|
259
|
+
3. No `box-shadow` — stripped by Canvas sanitizer
|
|
260
|
+
4. No `filter`, `transform`, `transition`, `animation`, `opacity` — all stripped
|
|
261
|
+
5. No `gap` in flex/grid — use `margin` on children OR use Canvas built-in grid classes
|
|
262
|
+
6. No `<h1>` in body HTML — Canvas uses H1 for the page title
|
|
263
|
+
7. No `@font-face` or `@import` — declare `Lato, sans-serif` and nothing else
|
|
264
|
+
8. No event attributes (`onclick`, `onload`, `onmouseover`, etc.) — all stripped
|
|
265
|
+
9. All external image URLs must use `https://`
|
|
266
|
+
10. `border-radius` IS allowed — use it on all cards, buttons, and pills
|
|
267
|
+
|
|
268
|
+
**Preferred layout approach:**
|
|
269
|
+
- Multi-column layouts → Canvas built-in `content-box` + `grid-row` + `col-xs-12 col-md-*` classes
|
|
270
|
+
- These handle mobile breakpoints automatically — no media query workarounds needed
|
|
271
|
+
|
|
272
|
+
**Generation checklist (run mentally before outputting any Canvas HTML):**
|
|
273
|
+
- [ ] No `<style>` block anywhere in the output
|
|
274
|
+
- [ ] No `<script>` tag anywhere in the output
|
|
275
|
+
- [ ] No disallowed CSS properties in any `style=""` attribute
|
|
276
|
+
- [ ] All headings start at H2 or lower
|
|
277
|
+
- [ ] Every `<img>` has an `alt=""` attribute
|
|
278
|
+
- [ ] All links have descriptive text (no "click here")
|
|
279
|
+
- [ ] Color contrast verified: text on colored backgrounds must meet 4.5:1
|
|
280
|
+
- [ ] Flex/grid uses margin instead of gap (or uses Canvas built-in classes)
|
|
281
|
+
- [ ] Content wrapped in a max-width div if it's a full page
|
|
282
|
+
|
|
283
|
+
**Course-specific context:**
|
|
284
|
+
- Institution: Boise State University
|
|
285
|
+
- Primary courses: ITM 310 (Business Intelligence), ITM 370 (AI Augmented Projects), BusApp 105
|
|
286
|
+
- Student audience: Business/IT undergraduate and graduate students
|
|
287
|
+
- Canvas theme: Loads Lato font at institutional level
|
|
288
|
+
- External add-ons: not required; pages must work as Canvas-safe HTML in the standard editor
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
============================================================
|
|
2
|
+
CANVAS DESIGN STUDIO — Professor Quick Start Guide
|
|
3
|
+
Boise State University
|
|
4
|
+
============================================================
|
|
5
|
+
|
|
6
|
+
This tool generates polished, branded Canvas assignment pages
|
|
7
|
+
using AI. You provide your assignment content; it handles the
|
|
8
|
+
design, formatting, and Canvas compatibility.
|
|
9
|
+
|
|
10
|
+
------------------------------------------------------------
|
|
11
|
+
WHAT YOU NEED
|
|
12
|
+
------------------------------------------------------------
|
|
13
|
+
|
|
14
|
+
1. Claude Code (free at claude.ai/code)
|
|
15
|
+
Install it, sign in with your Anthropic or Google account.
|
|
16
|
+
|
|
17
|
+
2. This project folder (canvas-design-studio/)
|
|
18
|
+
Open it in Claude Code as your working directory.
|
|
19
|
+
|
|
20
|
+
That's it. No coding required.
|
|
21
|
+
|
|
22
|
+
------------------------------------------------------------
|
|
23
|
+
STEP 1 — ADD YOUR ASSIGNMENT CONTENT
|
|
24
|
+
------------------------------------------------------------
|
|
25
|
+
|
|
26
|
+
Open this file and paste your raw assignment instructions:
|
|
27
|
+
|
|
28
|
+
ingest/assignment-brief.md
|
|
29
|
+
|
|
30
|
+
You can paste anything — Word doc text, bullet points, an
|
|
31
|
+
old Canvas page, rough notes. Don't worry about formatting.
|
|
32
|
+
Claude will clean it up.
|
|
33
|
+
|
|
34
|
+
------------------------------------------------------------
|
|
35
|
+
STEP 2 — RUN THIS PROMPT (copy and paste it exactly)
|
|
36
|
+
------------------------------------------------------------
|
|
37
|
+
|
|
38
|
+
Read everything in ingest/, then generate a Canvas
|
|
39
|
+
assignment page using the design system in this project.
|
|
40
|
+
Save it to output/.
|
|
41
|
+
|
|
42
|
+
Claude will notice if your course details are missing and
|
|
43
|
+
ask you for them in one message. Just reply with:
|
|
44
|
+
|
|
45
|
+
Professor: [Your Name]
|
|
46
|
+
Course Number: [e.g., BusApp 105]
|
|
47
|
+
Course Name: [e.g., Business Applications]
|
|
48
|
+
Assignment Number: [e.g., 3.2]
|
|
49
|
+
Semester: [e.g., Fall 2026]
|
|
50
|
+
|
|
51
|
+
It will fill those in automatically and then build the page.
|
|
52
|
+
|
|
53
|
+
------------------------------------------------------------
|
|
54
|
+
STEP 3 — GET YOUR HERO IMAGE (optional but recommended)
|
|
55
|
+
------------------------------------------------------------
|
|
56
|
+
|
|
57
|
+
After building, Claude will give you a prompt to use in
|
|
58
|
+
ChatGPT (chatgpt.com) to generate a banner image.
|
|
59
|
+
|
|
60
|
+
In ChatGPT:
|
|
61
|
+
1. Start a new chat
|
|
62
|
+
2. Click the image icon (or say "generate an image")
|
|
63
|
+
3. Paste the prompt Claude gives you
|
|
64
|
+
4. Download the image
|
|
65
|
+
5. Upload it to your Canvas course Files tab
|
|
66
|
+
6. Copy the file URL from Canvas
|
|
67
|
+
|
|
68
|
+
Then tell Claude:
|
|
69
|
+
|
|
70
|
+
My hero image URL is: [paste URL here]
|
|
71
|
+
|
|
72
|
+
It will drop it into your page automatically.
|
|
73
|
+
|
|
74
|
+
If you skip the image, the page still looks great —
|
|
75
|
+
the banner will show as a solid BSU blue gradient.
|
|
76
|
+
|
|
77
|
+
------------------------------------------------------------
|
|
78
|
+
STEP 4 — PASTE INTO CANVAS
|
|
79
|
+
------------------------------------------------------------
|
|
80
|
+
|
|
81
|
+
Your finished page is saved as a .html file in:
|
|
82
|
+
|
|
83
|
+
output/
|
|
84
|
+
|
|
85
|
+
To put it in Canvas:
|
|
86
|
+
|
|
87
|
+
1. Go to your Canvas course
|
|
88
|
+
2. Create a new Page (or open an existing one)
|
|
89
|
+
3. In the editor toolbar, click the HTML icon < >
|
|
90
|
+
(it may say "HTML Editor" or show angle brackets)
|
|
91
|
+
4. Select all the existing content and delete it
|
|
92
|
+
5. Paste your entire .html file contents
|
|
93
|
+
6. Click Save
|
|
94
|
+
|
|
95
|
+
Preview it — it should look exactly like the mockup.
|
|
96
|
+
|
|
97
|
+
------------------------------------------------------------
|
|
98
|
+
STEP 5 — REUSE FOR ANOTHER ASSIGNMENT
|
|
99
|
+
------------------------------------------------------------
|
|
100
|
+
|
|
101
|
+
Clear the ingest folder and start fresh:
|
|
102
|
+
|
|
103
|
+
1. Delete (or overwrite) ingest/assignment-brief.md
|
|
104
|
+
2. Run the same prompt again
|
|
105
|
+
|
|
106
|
+
Claude will ask for your course details again if needed,
|
|
107
|
+
or reuse them from the previous run if they're still in
|
|
108
|
+
ingest/course-config.md.
|
|
109
|
+
|
|
110
|
+
------------------------------------------------------------
|
|
111
|
+
TIPS
|
|
112
|
+
------------------------------------------------------------
|
|
113
|
+
|
|
114
|
+
- You can ask Claude to adjust anything after it builds:
|
|
115
|
+
"Make the overview section shorter."
|
|
116
|
+
"Add a grading rubric section."
|
|
117
|
+
"Change the tone to be more casual."
|
|
118
|
+
|
|
119
|
+
- To update your course colors (if BSU changes brand colors):
|
|
120
|
+
"Update the primary color to #XXXXXX in DESIGN.md and CLAUDE.md."
|
|
121
|
+
|
|
122
|
+
- If something looks wrong in Canvas, tell Claude:
|
|
123
|
+
"The two columns aren't stacking on mobile. Fix it."
|
|
124
|
+
|
|
125
|
+
------------------------------------------------------------
|
|
126
|
+
QUESTIONS?
|
|
127
|
+
------------------------------------------------------------
|
|
128
|
+
|
|
129
|
+
Contact: kevinrank@boisestate.edu
|
|
130
|
+
|
|
131
|
+
============================================================
|