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.
Files changed (118) hide show
  1. package/CLAUDE.md +200 -0
  2. package/DESIGN.md +288 -0
  3. package/PROFESSOR-INSTRUCTIONS.txt +131 -0
  4. package/README.md +250 -0
  5. package/dist/canvas-api.d.ts +24 -0
  6. package/dist/canvas-api.d.ts.map +1 -0
  7. package/dist/canvas-api.js +146 -0
  8. package/dist/canvas-api.js.map +1 -0
  9. package/dist/config.d.ts +5 -0
  10. package/dist/config.d.ts.map +1 -0
  11. package/dist/config.js +22 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/design-engine.d.ts +5 -0
  14. package/dist/design-engine.d.ts.map +1 -0
  15. package/dist/design-engine.js +23 -0
  16. package/dist/design-engine.js.map +1 -0
  17. package/dist/index.d.ts +3 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +567 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/tools/accessibility.d.ts +7 -0
  22. package/dist/tools/accessibility.d.ts.map +1 -0
  23. package/dist/tools/accessibility.js +149 -0
  24. package/dist/tools/accessibility.js.map +1 -0
  25. package/dist/tools/contrast.d.ts +2 -0
  26. package/dist/tools/contrast.d.ts.map +1 -0
  27. package/dist/tools/contrast.js +7 -0
  28. package/dist/tools/contrast.js.map +1 -0
  29. package/dist/tools/critique.d.ts +23 -0
  30. package/dist/tools/critique.d.ts.map +1 -0
  31. package/dist/tools/critique.js +194 -0
  32. package/dist/tools/critique.js.map +1 -0
  33. package/dist/tools/generate.d.ts +18 -0
  34. package/dist/tools/generate.d.ts.map +1 -0
  35. package/dist/tools/generate.js +101 -0
  36. package/dist/tools/generate.js.map +1 -0
  37. package/dist/tools/gotchas.d.ts +7 -0
  38. package/dist/tools/gotchas.d.ts.map +1 -0
  39. package/dist/tools/gotchas.js +61 -0
  40. package/dist/tools/gotchas.js.map +1 -0
  41. package/dist/tools/ingest.d.ts +44 -0
  42. package/dist/tools/ingest.d.ts.map +1 -0
  43. package/dist/tools/ingest.js +211 -0
  44. package/dist/tools/ingest.js.map +1 -0
  45. package/dist/tools/list-courses.d.ts +16 -0
  46. package/dist/tools/list-courses.d.ts.map +1 -0
  47. package/dist/tools/list-courses.js +79 -0
  48. package/dist/tools/list-courses.js.map +1 -0
  49. package/dist/tools/page-io.d.ts +19 -0
  50. package/dist/tools/page-io.d.ts.map +1 -0
  51. package/dist/tools/page-io.js +77 -0
  52. package/dist/tools/page-io.js.map +1 -0
  53. package/dist/tools/panopto.d.ts +36 -0
  54. package/dist/tools/panopto.d.ts.map +1 -0
  55. package/dist/tools/panopto.js +188 -0
  56. package/dist/tools/panopto.js.map +1 -0
  57. package/dist/tools/personas.d.ts +21 -0
  58. package/dist/tools/personas.d.ts.map +1 -0
  59. package/dist/tools/personas.js +464 -0
  60. package/dist/tools/personas.js.map +1 -0
  61. package/dist/tools/philosophy.d.ts +21 -0
  62. package/dist/tools/philosophy.d.ts.map +1 -0
  63. package/dist/tools/philosophy.js +137 -0
  64. package/dist/tools/philosophy.js.map +1 -0
  65. package/dist/tools/publish.d.ts +31 -0
  66. package/dist/tools/publish.d.ts.map +1 -0
  67. package/dist/tools/publish.js +198 -0
  68. package/dist/tools/publish.js.map +1 -0
  69. package/dist/tools/redesign.d.ts +18 -0
  70. package/dist/tools/redesign.d.ts.map +1 -0
  71. package/dist/tools/redesign.js +68 -0
  72. package/dist/tools/redesign.js.map +1 -0
  73. package/dist/tools/update-kb.d.ts +10 -0
  74. package/dist/tools/update-kb.d.ts.map +1 -0
  75. package/dist/tools/update-kb.js +93 -0
  76. package/dist/tools/update-kb.js.map +1 -0
  77. package/dist/tools/validate.d.ts +10 -0
  78. package/dist/tools/validate.d.ts.map +1 -0
  79. package/dist/tools/validate.js +76 -0
  80. package/dist/tools/validate.js.map +1 -0
  81. package/dist/types.d.ts +65 -0
  82. package/dist/types.d.ts.map +1 -0
  83. package/dist/types.js +2 -0
  84. package/dist/types.js.map +1 -0
  85. package/dist/wizard.d.ts +3 -0
  86. package/dist/wizard.d.ts.map +1 -0
  87. package/dist/wizard.js +229 -0
  88. package/dist/wizard.js.map +1 -0
  89. package/docs/canvas-design-kb/00-meta/Changelog.md +42 -0
  90. package/docs/canvas-design-kb/00-meta/Contributing.md +58 -0
  91. package/docs/canvas-design-kb/00-meta/KB-Overview.md +51 -0
  92. package/docs/canvas-design-kb/01-canvas-rce/CSS-Inline-Strategy.md +166 -0
  93. package/docs/canvas-design-kb/01-canvas-rce/Canvas-Built-In-CSS-Classes.md +243 -0
  94. package/docs/canvas-design-kb/01-canvas-rce/Canvas-Page-Types.md +59 -0
  95. package/docs/canvas-design-kb/01-canvas-rce/HTML-Allowlist.md +204 -0
  96. package/docs/canvas-design-kb/01-canvas-rce/RCE-Limitations-and-Workarounds.md +151 -0
  97. package/docs/canvas-design-kb/01-canvas-rce/RCE-Overview.md +92 -0
  98. package/docs/canvas-design-kb/02-design-md/DESIGN-MD-Canvas-Template.md +323 -0
  99. package/docs/canvas-design-kb/02-design-md/DESIGN-MD-File-Structure.md +245 -0
  100. package/docs/canvas-design-kb/02-design-md/DESIGN-MD-Overview.md +120 -0
  101. package/docs/canvas-design-kb/02-design-md/DESIGN-MD-Toolchain.md +234 -0
  102. package/docs/canvas-design-kb/03-design-systems/Color-and-Typography.md +146 -0
  103. package/docs/canvas-design-kb/03-design-systems/Component-Library.md +299 -0
  104. package/docs/canvas-design-kb/03-design-systems/Design-System-Principles.md +99 -0
  105. package/docs/canvas-design-kb/04-tools/Canvas-Theme-Editor.md +40 -0
  106. package/docs/canvas-design-kb/04-tools/Other-Canvas-Design-Tools.md +47 -0
  107. package/docs/canvas-design-kb/05-patterns/Course-Home-Page.md +224 -0
  108. package/docs/canvas-design-kb/06-accessibility/Accessibility-Overview.md +128 -0
  109. package/docs/canvas-design-kb/07-resources/Inspiration-and-Showcases.md +121 -0
  110. package/docs/canvas-design-kb/07-resources/Official-Canvas-Links.md +54 -0
  111. package/docs/canvas-design-kb/README.md +58 -0
  112. package/docs/feature-roadmap.md +123 -0
  113. package/docs/installation.md +340 -0
  114. package/package.json +45 -0
  115. package/scripts/deploy-public.ps1 +68 -0
  116. package/src/kb/design-principles.md +45 -0
  117. package/src/templates/ignite-assignment-page.html +203 -0
  118. 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
+ ============================================================