diff --git a/examples/responsive-app/assets/img/866-1024x1024.jpg b/examples/responsive-app/assets/img/866-1024x1024.jpg
new file mode 100644
index 000000000..80cee2b47
Binary files /dev/null and b/examples/responsive-app/assets/img/866-1024x1024.jpg differ
diff --git a/examples/responsive-app/index.css b/examples/responsive-app/index.css
new file mode 100644
index 000000000..37b2c80e1
--- /dev/null
+++ b/examples/responsive-app/index.css
@@ -0,0 +1,8 @@
+body,
+html {
+ margin: 0;
+ padding: 0;
+ font-family: -apple-system, Roboto, sans-serif;
+ background-color: #fafafa;
+ min-width: 320px;
+}
diff --git a/examples/responsive-app/index.html b/examples/responsive-app/index.html
new file mode 100644
index 000000000..510a0e5e5
--- /dev/null
+++ b/examples/responsive-app/index.html
@@ -0,0 +1,20 @@
+
+
+
+ Responsive App Demo
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/responsive-app/package.json b/examples/responsive-app/package.json
new file mode 100644
index 000000000..ce7a5791c
--- /dev/null
+++ b/examples/responsive-app/package.json
@@ -0,0 +1,10 @@
+{
+ "name": "responsive-app",
+ "version": "1.0.0",
+ "dependencies": {
+ "mod": "*"
+ },
+ "mappings": {
+ "mod": "../../"
+ }
+}
diff --git a/examples/responsive-app/ui/footer.mod/footer.css b/examples/responsive-app/ui/footer.mod/footer.css
new file mode 100644
index 000000000..39a4ffcc5
--- /dev/null
+++ b/examples/responsive-app/ui/footer.mod/footer.css
@@ -0,0 +1,5 @@
+.Footer {
+ display: flex;
+ flex-direction: row;
+ gap: 16px;
+}
diff --git a/examples/responsive-app/ui/footer.mod/footer.html b/examples/responsive-app/ui/footer.mod/footer.html
new file mode 100644
index 000000000..7385700d2
--- /dev/null
+++ b/examples/responsive-app/ui/footer.mod/footer.html
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/responsive-app/ui/footer.mod/footer.js b/examples/responsive-app/ui/footer.mod/footer.js
new file mode 100644
index 000000000..47e4fc3b7
--- /dev/null
+++ b/examples/responsive-app/ui/footer.mod/footer.js
@@ -0,0 +1,10 @@
+/**
+ * @module "ui/footer.mod"
+ */
+const Component = require("mod/ui/component").Component;
+
+/**
+ * @class Footer
+ * @extends Component
+ */
+exports.Footer = class Footer extends Component {};
diff --git a/examples/responsive-app/ui/list-item.mod/list-item.css b/examples/responsive-app/ui/list-item.mod/list-item.css
new file mode 100644
index 000000000..f0e33a65c
--- /dev/null
+++ b/examples/responsive-app/ui/list-item.mod/list-item.css
@@ -0,0 +1,43 @@
+.ListItem {
+ display: flex;
+ flex-direction: column;
+ padding: 8px 12px;
+ border-bottom: 1px solid #eee;
+ background-color: #f9f9f9;
+ gap: 8px;
+
+ .ListItem-title {
+ font-weight: bold;
+ flex: 0 0 150px;
+ }
+
+ .ListItem-description {
+ color: #666;
+ font-size: 0.9rem;
+ flex: 1;
+ }
+
+ @container (min-width: 400px) {
+ gap: 16px;
+ padding: 12px 16px;
+
+ .ListItem-description {
+ font-size: 0.95rem;
+ }
+ }
+
+ @container (min-width: 600px) {
+ flex-direction: row;
+ align-items: center;
+ gap: 24px;
+ padding: 16px 24px;
+
+ .ListItem-title {
+ font-size: 1.2rem;
+ }
+
+ .ListItem-description {
+ font-size: 1rem;
+ }
+ }
+}
diff --git a/examples/responsive-app/ui/list-item.mod/list-item.html b/examples/responsive-app/ui/list-item.mod/list-item.html
new file mode 100644
index 000000000..efafde0d0
--- /dev/null
+++ b/examples/responsive-app/ui/list-item.mod/list-item.html
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/responsive-app/ui/list-item.mod/list-item.js b/examples/responsive-app/ui/list-item.mod/list-item.js
new file mode 100644
index 000000000..54bc6c386
--- /dev/null
+++ b/examples/responsive-app/ui/list-item.mod/list-item.js
@@ -0,0 +1,10 @@
+/**
+ * @module "ui/list-item.mod"
+ */
+const Component = require("mod/ui/component").Component;
+
+/**
+ * @class ListItem
+ * @extends Component
+ */
+exports.ListItem = class ListItem extends Component {};
diff --git a/examples/responsive-app/ui/main.mod/main.css b/examples/responsive-app/ui/main.mod/main.css
new file mode 100644
index 000000000..3935f7856
--- /dev/null
+++ b/examples/responsive-app/ui/main.mod/main.css
@@ -0,0 +1,53 @@
+.Main {
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+ padding: 0 16px;
+
+ > .Main-header {
+ display: flex;
+ flex-direction: row-reverse;
+ justify-content: flex-end;
+ align-items: center;
+ gap: 12px;
+
+ > .Main-title {
+ font-size: 1.5rem;
+ font-weight: bold;
+ }
+
+ > .Main-logo {
+ flex-shrink: 0;
+ height: 48px;
+ width: 48px;
+
+ > img {
+ border-radius: 4px;
+ }
+ }
+ }
+}
+
+/* Tablets */
+@media screen and (min-width: 768px) {
+ .Main {
+ > .Main-header {
+ justify-content: space-between;
+ flex-direction: row;
+
+ > .Main-title {
+ font-size: 2rem;
+ }
+
+ > .Main-logo {
+ /* 16/9 ratio */
+ width: 128px;
+ height: 72px;
+ }
+ }
+
+ > .Main-nav {
+ max-width: 600px;
+ }
+ }
+}
diff --git a/examples/responsive-app/ui/main.mod/main.html b/examples/responsive-app/ui/main.mod/main.html
new file mode 100644
index 000000000..2f202e5cd
--- /dev/null
+++ b/examples/responsive-app/ui/main.mod/main.html
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
+
+ Responsive App Demo
+
+
+
+
+
+
+
+
diff --git a/examples/responsive-app/ui/main.mod/main.js b/examples/responsive-app/ui/main.mod/main.js
new file mode 100644
index 000000000..891b27d5a
--- /dev/null
+++ b/examples/responsive-app/ui/main.mod/main.js
@@ -0,0 +1,22 @@
+/**
+ * @module "ui/main.mod"
+ */
+const Component = require("mod/ui/component").Component;
+
+/**
+ * @class Main
+ * @extends Component
+ */
+exports.Main = class Main extends Component {
+ menuOptions = [
+ { label: "Home", value: "home" },
+ { label: "About", value: "about" },
+ { label: "Contact", value: "contact" },
+ ];
+
+ items = [
+ { title: "Item 1", description: "This is the first item." },
+ { title: "Item 2", description: "This is the second item." },
+ { title: "Item 3", description: "This is the third item." },
+ ];
+};
diff --git a/index.html b/index.html
index 48ccd940a..b81359a87 100644
--- a/index.html
+++ b/index.html
@@ -67,6 +67,7 @@ Tests:
Examples:
Data App
+ Responsive App