29 Commits
v1.1.1 ... 1.3

Author SHA1 Message Date
e5a78b1571 [tabs] Fixed push state to push the full url from the pathname on.
With pushState is being called with the hash string only (e.g., "#tab:...") as the URL argument — when the second arg (title) is "" and third arg is a URL that starts with "#", some browsers and environments treat that as a full URL replacement and strip the path.
2026-03-28 11:07:06 -04:00
a4fc62ca5c [tabs] Fix conflict with anchor links / hashes 2026-03-18 16:32:42 -04:00
97a7cabba3 [tab] Ensure that correct tab panel is showing when sorting tabs. 2026-01-13 15:11:07 -05:00
cfd23cd1a3 Reprocess CSS to be not minimised. 2025-12-23 09:12:49 -05:00
37762504a4 [config] Add example text 2025-12-23 09:11:52 -05:00
1354aac065 [tab] Add information about tab order. 2025-12-23 09:11:19 -05:00
d3f25a5ef1 [core] Fix Global built-in functions are deprecated and will be removed in Dart Sass 3.0.0. 2025-12-20 10:24:57 -05:00
f7a343b626 [header] Fix embeded SVG. 2025-12-20 10:24:46 -05:00
162d55a8ce Add footer block in the container and a top and bottom block outside container. 2025-12-16 16:08:55 -05:00
1bb1c297b3 Fit accessibility header better 2025-10-08 09:43:49 -04:00
3514094043 Allow content for any part of tabs 2025-10-07 13:32:47 -04:00
b6cc236ced Fix tabs 2025-08-03 19:21:37 -04:00
f78b0a4c63 Fix spacing 2025-08-03 18:31:00 -04:00
7bcb45d9bc Fix display so that it doesn't cause an overflow when not hidden. 2025-08-03 18:03:55 -04:00
05fbea8dfd Fix tabs -- undo details that didn't properly on mobile. 2025-08-03 18:03:22 -04:00
e0d62ccc4f Fixes #36 Update status to match core 2025-07-04 00:03:14 -04:00
2941a5903f Fixes #32 Should fix the scrolling issue and clean up console messages 2025-06-12 18:56:21 -04:00
857680c3b1 Fixes #33 Default array if there isn't a downloadExtensions key in the config 2025-06-10 16:55:34 -04:00
b44b17d830 Fixes #34 some issues with breakpoints 2025-06-10 16:26:52 -04:00
8fe6e39440 Move breakpoints to breakpoint for easier @use 2025-06-09 20:44:21 -04:00
5f050066e9 Fixes #4, #29, #32 Creates links as tabs in history, fixed tab error line. 2025-06-09 19:16:59 -04:00
0b5e54faa6 Fix colours(fixes #31) 2025-05-14 19:21:01 -04:00
6d8b9d0e47 switch core to use @use(fixes #31) 2025-05-14 18:04:28 -04:00
9db11f3f97 Fix ending period. 2025-05-14 17:53:11 -04:00
df95905fe0 Fix for render issue for tabs 2025-04-22 15:25:41 -04:00
89870edaaf Make module definitions consistent 2025-04-03 07:42:09 -04:00
ca3f9970a9 Update tabs to allow for custom color on tab and top bar. 2025-02-04 16:55:15 -05:00
d5cbcb5807 Focusing the tab seems to have improved the reliability of the click happening. 2025-02-04 13:06:52 -05:00
a204f7fc98 Update core.scss.pug (and associated files) 2025-02-04 10:30:15 -05:00
47 changed files with 1358 additions and 804 deletions

View File

@@ -100,4 +100,4 @@ You will now be able to include the .pp file in your pattern's index file while
## Credits ## Credits
This framework includes [PrismJS](https://prismjs.com/) for code syntax highlighting. PrismJS is released under the [MIT license](https://opensource.org/licenses/MIT)> This framework includes [PrismJS](https://prismjs.com/) for code syntax highlighting. PrismJS is released under the [MIT license](https://opensource.org/licenses/MIT).

View File

@@ -354,17 +354,6 @@
"keep_fnames": false, "keep_fnames": false,
"safari10": false "safari10": false
}, },
"node-sass": {
"indentType": "space",
"allowWildcardImports": false,
"indentWidth": 2,
"linefeed": "lf",
"outputStyle": "expanded",
"precision": 10,
"sourceMap": false,
"removeCharset": false,
"sourceComments": false
},
"png": { "png": {
"quality": 90 "quality": 90
}, },
@@ -442,6 +431,17 @@
"turf": { "turf": {
"rootDir": "" "rootDir": ""
}, },
"node-sass": {
"indentType": "space",
"allowWildcardImports": false,
"indentWidth": 2,
"linefeed": "lf",
"outputStyle": "expanded",
"precision": 10,
"sourceMap": false,
"removeCharset": false,
"sourceComments": false
},
"typescript": { "typescript": {
"allowJs": false, "allowJs": false,
"allowSyntheticDefaultImports": true, "allowSyntheticDefaultImports": true,
@@ -516,7 +516,7 @@
}, },
{ {
"task": "minify-css", "task": "minify-css",
"enable": true "enable": false
} }
], ],
"output": { "output": {
@@ -1372,6 +1372,12 @@
} }
} }
}, },
{
"file": "src/pg/patterns/core/header/_header.pp",
"config": {
"autoCompile": true
}
},
{ {
"file": "src/pg/patterns/core/sticky-note/_sticky-note.pp", "file": "src/pg/patterns/core/sticky-note/_sticky-note.pp",
"config": { "config": {

View File

@@ -3014,13 +3014,8 @@ Prism.languages.webmanifest = Prism.languages.json;
/***/ }), /***/ }),
/* 8 */ /* 8 */
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { /***/ (function(module) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */ init: function() { return /* binding */ init; }
/* harmony export */ });
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
@@ -3122,35 +3117,37 @@ var calculateStickyPosition = function calculateStickyPosition(s) {
}); });
} }
}; };
function init() { module.exports = {
var p = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document; init: function init() {
font.size = parseFloat(getComputedStyle(document.documentElement).fontSize.replace("px", "")); var p = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;
p.querySelectorAll("sticky-note").forEach(function (s) {
if (s.querySelectorAll("svg").length == 0) {
var wrapper = document.createElement("sticky-note-wrapper");
s.parentNode.insertBefore(wrapper, s);
wrapper.appendChild(s);
s.setAttribute("content", s.innerHTML.replace(/"/g, "\""));
s.innerHTML = "<div><svg width='0' height='0'><defs><clipPath id='stickyClip' clipPathUnits='objectBoundingBox'><path d='M 0 0 Q 0 0.69, 0.03 0.96 0.03 0.96, 1 0.96 Q 0.96 0.69, 0.96 0 0.96 0, 0 0' stroke-linejoin='round' stroke-linecap='square' /></clipPath></defs></svg></div><div><div>".concat(s.innerHTML, "</div></div>");
}
calculateStickyPosition(s);
drag(s);
s.ondblclick = function (e) {
if (e.ctrlKey) {
calculateStickyPosition(s);
} else {
// add one click select
}
};
});
window.onresize = function () {
font.size = parseFloat(getComputedStyle(document.documentElement).fontSize.replace("px", "")); font.size = parseFloat(getComputedStyle(document.documentElement).fontSize.replace("px", ""));
var stickies = p.querySelectorAll("sticky-note"); p.querySelectorAll("sticky-note").forEach(function (s) {
stickies.forEach(function (s) { if (s.querySelectorAll("svg").length == 0) {
var wrapper = document.createElement("sticky-note-wrapper");
s.parentNode.insertBefore(wrapper, s);
wrapper.appendChild(s);
s.setAttribute("content", s.innerHTML.replace(/"/g, "\""));
s.innerHTML = "<div><svg width='0' height='0'><defs><clipPath id='stickyClip' clipPathUnits='objectBoundingBox'><path d='M 0 0 Q 0 0.69, 0.03 0.96 0.03 0.96, 1 0.96 Q 0.96 0.69, 0.96 0 0.96 0, 0 0' stroke-linejoin='round' stroke-linecap='square' /></clipPath></defs></svg></div><div><div>".concat(s.innerHTML, "</div></div>");
}
calculateStickyPosition(s); calculateStickyPosition(s);
drag(s);
s.ondblclick = function (e) {
if (e.ctrlKey) {
calculateStickyPosition(s);
} else {
// add one click select
}
};
}); });
}; window.onresize = function () {
} font.size = parseFloat(getComputedStyle(document.documentElement).fontSize.replace("px", ""));
var stickies = p.querySelectorAll("sticky-note");
stickies.forEach(function (s) {
calculateStickyPosition(s);
});
};
}
};
/***/ }), /***/ }),
/* 9 */ /* 9 */
@@ -3226,58 +3223,104 @@ var waitForElement = function waitForElement(selector) {
}); });
}); });
}; };
var chooseTab = function chooseTab(tab) {
var siblings = Array.from(tab.parentNode.children);
siblings.forEach(function (sibling) {
return sibling.classList.remove("selected");
});
tab.classList.add("selected");
var tabPanels = Array.from(tab.parentNode.parentNode.children);
tabPanels.forEach(function (panel) {
return panel.classList.remove("open");
});
var tabPanelId = tab.getAttribute("id").replace("tab", "tab-panel");
document.getElementById(tabPanelId).classList.add("open");
};
var pushState = 0;
var tabsetCount = 0;
function init() { function init() {
var container = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document; var container = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : document;
var spacer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; var spacer = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
var args = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; var args = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
container.querySelectorAll(".tab-group, tabset").forEach(function (tabGroup) { container.querySelectorAll(".tab-group, tabset").forEach(function (tabGroup) {
if (tabGroup.querySelector("[role=tablist]") === null) { if (tabGroup.querySelector("[role=tablist]") === null) {
if (tabGroup.getAttribute("id") == null) {
tabGroup.setAttribute("id", "tab-group-" + tabsetCount);
tabsetCount++;
}
var tabgroup = tabGroup.getAttribute("id"); var tabgroup = tabGroup.getAttribute("id");
var tablist = ""; var tablist = "";
Array.from(tabGroup.children).forEach(function (child) { Array.from(tabGroup.children).forEach(function (child) {
var tab = child.getAttribute("tab") || child.getAttribute("data-tab"); // is details?
var dtls = child.nodeName == "DETAILS" ? true : false;
// get the tab text
var tab = dtls ? child.querySelector("summary").innerHTML : child.getAttribute("tab") || child.getAttribute("data-tab");
// if the tab text is not blank
if (tab !== null) { if (tab !== null) {
var tabID = tab.replace(/\W+/g, "-").toLowerCase(); var tabID = tab.replace(/\W+/g, "-").toLowerCase();
var tabPanel = document.createElement('div');
// define the tab panel content
var tabPanel = null;
if (dtls) {
tabPanel = child;
tabPanel.setAttribute("open", "");
} else {
tabPanel = document.createElement('div');
tabPanel.appendChild(child.cloneNode(true));
}
tabPanel.id = "tab-panel-".concat(tabgroup, "-").concat(tabID); tabPanel.id = "tab-panel-".concat(tabgroup, "-").concat(tabID);
tabPanel.className = tablist === "" ? "open" : ""; tabPanel.className = tablist === "" ? "open" : "";
tabPanel.setAttribute("role", "tabpanel"); tabPanel.setAttribute("role", "tabpanel");
tabPanel.setAttribute("tabindex", "0"); tabPanel.setAttribute("tabindex", "0");
tabPanel.setAttribute("aria-labelledby", "tab-".concat(tabgroup, "-").concat(tabID)); tabPanel.setAttribute("aria-labelledby", "tab-".concat(tabgroup, "-").concat(tabID));
tabPanel.appendChild(child.cloneNode(true));
child.parentNode.replaceChild(tabPanel, child); child.parentNode.replaceChild(tabPanel, child);
tablist += "<li tabindex=\"0\" role=\"tab\" ".concat(tablist === "" ? "class='selected'" : "", " id=\"tab-").concat(tabgroup, "-").concat(tabID, "\"><span>").concat(tab, "</span></li>"); tablist += "<li tabindex=\"0\" role=\"tab\" id=\"tab-".concat(tabgroup, "-").concat(tabID, "\"><span>").concat(tab, "</span></li>");
} else { } else {
child.classList.add("tab-hidden"); child.classList.add("tab-hidden");
} }
}); });
var ul = document.createElement('ul'); var ul = document.createElement('ul');
ul.setAttribute("role", "tablist"); ul.setAttribute("role", "tablist");
ul.innerHTML = spacer != true ? "".concat(tablist) : "".concat(tablist, "<li role=\"separator\" class=\"separator\"></li>");
tabGroup.insertBefore(ul, tabGroup.firstChild); tabGroup.insertBefore(ul, tabGroup.firstChild);
ul.innerHTML = spacer != true ? "".concat(tablist) : "".concat(tablist, "<li role=\"separator\" class=\"separator\"></li>");
if (tabGroup.hasAttribute("order") || tabGroup.hasAttribute("data-order")) {
var order = (tabGroup.getAttribute("order") || tabGroup.getAttribute("data-order")).split(",");
var items = Array.from(ul.getElementsByTagName("li"));
items.sort(function (a, b) {
console.log("here");
var aa = order.indexOf(a.textContent.trim());
var bb = order.indexOf(b.textContent.trim());
// Check if both items exist in orderArray
if (aa === -1) return 1; // Move to the end if not found
if (bb === -1) return -1; // Move to the end if not found
return aa - bb; // Sort based on the defined order
});
ul.innerHTML = '';
items.forEach(function (item) {
return ul.appendChild(item);
});
}
tabGroup.querySelectorAll('[role="tab"]').forEach(function (tab) { tabGroup.querySelectorAll('[role="tab"]').forEach(function (tab) {
tab.addEventListener("click", function (e) { tab.addEventListener("click", function (evt) {
if (e.altKey && typeof args.altModifier == "function") { if (pushState == 0) {
args.altModifier(tab); window.history.pushState({
} else if (e.shiftKey && typeof args.shiftModifier == "function") { rand: Math.random(),
args.shiftModifier(tab); pushState: pushState,
} else if (e.metaKey && typeof args.metaModifier == "function") { tab: tab.parentNode.firstChild.getAttribute("id")
args.metaModifier(tab); }, "", "#".concat(tab.parentNode.firstChild.getAttribute("id")));
} else { pushState++;
var siblings = Array.from(tab.parentNode.children);
siblings.forEach(function (sibling) {
return sibling.classList.remove("selected");
});
tab.classList.add("selected");
var tabPanels = Array.from(tab.parentNode.parentNode.children).filter(function (child) {
return child.getAttribute("role") === "tabpanel";
});
tabPanels.forEach(function (panel) {
return panel.classList.remove("open");
});
var tabPanelId = tab.getAttribute("id").replace("tab", "tab-panel");
document.getElementById(tabPanelId).classList.add("open");
} }
chooseTab(evt.currentTarget);
window.history.pushState({
rand: Math.random(),
pushState: pushState,
tab: tab.getAttribute("id")
}, "", "#".concat(tab.getAttribute("id")));
pushState++;
}); });
tab.addEventListener("keypress", function (e) { tab.addEventListener("keypress", function (e) {
e.preventDefault(); e.preventDefault();
@@ -3286,14 +3329,24 @@ function init() {
} }
}); });
}); });
ul.querySelector("li").classList.add("selected");
} }
if (document.location.hash != "" && document.location.hash.substring(0, 5) == "#tab-") { if (document.location.hash != "" && document.location.hash.substring(0, 5) == "#tab-") {
waitForElement(document.location.hash).then(function (el) { waitForElement(document.location.hash).then(function (el) {
el.scrollIntoView(); //el.scrollIntoView();
el.focus();
el.dispatchEvent(click); el.dispatchEvent(click);
}); });
} }
}); });
window.addEventListener("popstate", function (e) {
e.preventDefault();
if (e.state != null) {
chooseTab(document.querySelector("#".concat(e.state.tab)));
} else {
history.go(-1);
}
});
} }
/***/ }) /***/ })
@@ -3397,6 +3450,7 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var _node_modules_prismjs_components_prism_sass__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(7); /* harmony import */ var _node_modules_prismjs_components_prism_sass__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(7);
/* harmony import */ var _node_modules_prismjs_components_prism_sass__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_node_modules_prismjs_components_prism_sass__WEBPACK_IMPORTED_MODULE_6__); /* harmony import */ var _node_modules_prismjs_components_prism_sass__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_node_modules_prismjs_components_prism_sass__WEBPACK_IMPORTED_MODULE_6__);
/* harmony import */ var _pg_patterns_core_sticky_note_sticky_note_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(8); /* harmony import */ var _pg_patterns_core_sticky_note_sticky_note_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(8);
/* harmony import */ var _pg_patterns_core_sticky_note_sticky_note_js__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_pg_patterns_core_sticky_note_sticky_note_js__WEBPACK_IMPORTED_MODULE_7__);
/* harmony import */ var _pg_patterns_core_switch_switch_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(9); /* harmony import */ var _pg_patterns_core_switch_switch_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(9);
/* harmony import */ var _pg_patterns_core_switch_switch_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_pg_patterns_core_switch_switch_js__WEBPACK_IMPORTED_MODULE_8__); /* harmony import */ var _pg_patterns_core_switch_switch_js__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(_pg_patterns_core_switch_switch_js__WEBPACK_IMPORTED_MODULE_8__);
/* harmony import */ var _pg_patterns_core_tabs_tabs_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(10); /* harmony import */ var _pg_patterns_core_tabs_tabs_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(10);

File diff suppressed because one or more lines are too long

View File

@@ -24,7 +24,7 @@
return $result; return $result;
} }
$allowed_types = ["scss", "js"]; $allowed_types = ['js','pug','scss'];
$patterns = dirname(dirname(__file__)) . "/src/pg/patterns"; $patterns = dirname(dirname(__file__)) . "/src/pg/patterns";

View File

@@ -76,8 +76,8 @@
<h1 class="status-complete"><span>Header <h1 class="status-complete"><span>Header
<tool-tip role="tooltip" inert="inert" tip-position="right">Complete</tool-tip></span></h1> <tool-tip role="tooltip" inert="inert" tip-position="right">Complete</tool-tip></span></h1>
</article> </article>
<article id="layouts-breakpoints" data-name="breakpoints" data-status="complete" data-template="pug" data-core="true" data-path="layouts/breakpoints" style="height: 100vh"> <article id="layouts-breakpoint" data-name="breakpoint" data-status="complete" data-template="pug" data-core="true" data-path="layouts/breakpoint" style="height: 100vh">
<h1 class="status-complete"><span>Breakpoints <h1 class="status-complete"><span>Breakpoint
<tool-tip role="tooltip" inert="inert" tip-position="right">Complete</tool-tip></span></h1> <tool-tip role="tooltip" inert="inert" tip-position="right">Complete</tool-tip></span></h1>
</article> </article>
<article id="layouts-tabs" data-name="tabs" data-status="complete" data-template="pug" data-core="true" data-path="layouts/tabs" style="height: 100vh"> <article id="layouts-tabs" data-name="tabs" data-status="complete" data-template="pug" data-core="true" data-path="layouts/tabs" style="height: 100vh">

View File

@@ -2,6 +2,13 @@
<html> <html>
<head> <head>
<title>Pattern</title> <title>Pattern</title>
<script>
let u = document.location.href.substring(0, document.location.href.search(/patterns/i));
let p = document.location.pathname.substring(document.location.pathname.search(/patterns/i));
p = p.replace(/\/$|\/index\.html/i, "").substring(9);
window.location = u + "?p=" + p;
</script>
</head> </head>
<body data-prismjs-copy-timeout="1500"> <body data-prismjs-copy-timeout="1500">
<h2>What is it</h2> <h2>What is it</h2>
@@ -14,22 +21,27 @@
<p>When using this, use the default break points as they are set to the same as the Bootstrap framework. The grid for the design system at large break point has been widened to accompdate 3 colour cards across. </p> <p>When using this, use the default break points as they are set to the same as the Bootstrap framework. The grid for the design system at large break point has been widened to accompdate 3 colour cards across. </p>
<tabset id="breakpoints"> <tabset id="breakpoints">
<div tab="scss"> <div tab="scss">
<pre class="language-sass">@import "[path-to]/breakpoints"; <h2>Example</h2>
@include break([breakpoint]) { <pre class="language-sass">@use "scss/core/breakpoint/breakpoint";
@include breapoint.break([breakpoint]) {
// css here // css here
}</pre> }</pre>
<pre class="language-sass">//- DS2 core (c) 2024 Alexander McIlwraith <pre class="language-sass">//- DS2 core (c) 2024 Alexander McIlwraith
//- Licensed under CC BY-SA 4.0 //- Licensed under CC BY-SA 4.0
@use 'sass:map';
@use 'sass:string';
// default breakpoints match bootstrap 5 breakpoints. // default breakpoints match bootstrap 5 breakpoints.
$grid-breakpoints: ( xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px ) !default; $grid-breakpoints: ( xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px ) !default;
@mixin breakpoint-debug { @mixin debug {
body::before, body::after { body::before, body::after {
background-color: #555; background-color: #555;
color: white; color: white;
content: "bigger than extra large"; content: "bigger than extra large";
display: grid; display: grid;
font-family: sans-serif;
font-size: 25px; font-size: 25px;
grid-template-columns: auto; grid-template-columns: auto;
padding: 25px; padding: 25px;
@@ -57,30 +69,30 @@ $grid-breakpoints: ( xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 14
$min: 0; $min: 0;
$max: 0; $max: 0;
@if str-length($bp) == 2 { @if string.length($bp) == 2 {
// only a single break point was received // only a single break point was received
$min: map-get($points, $bp); $min: map.get($points, $bp);
$max: map-get($points, nth(map-keys($points), index(map-keys($points), $bp) + 1)); $max: map.get($points, nth(map.keys($points), index(map.keys($points), $bp) + 1));
} @else { } @else {
@if str-slice($bp, 0, 1) == "-" { @if string.slice($bp, 0, 1) == "-" {
// no lower breakpoint was received // no lower breakpoint was received
$min: null; $min: null;
$max: map-get($points, str-slice($bp, 2, 3)); $max: map.get($points, string.slice($bp, 2, 3));
} @else { } @else {
$min: map-get($points, unquote(str-slice($bp, 0, 2))); $min: map.get($points, string.unquote(string.slice($bp, 0, 2)));
@if str-length($bp) == 3 { @if string.length($bp) == 3 {
// no upper break point was received // no upper break point was received
$max: null; $max: null;
} @else { } @else {
$max: map-get($points, str-slice($bp, 4, 5)); $max: map.get($points, string.slice($bp, 4, 5));
} }
} }
} }

View File

@@ -2,6 +2,13 @@
<html> <html>
<head> <head>
<title>Pattern</title> <title>Pattern</title>
<script>
let u = document.location.href.substring(0, document.location.href.search(/patterns/i));
let p = document.location.pathname.substring(document.location.pathname.search(/patterns/i));
p = p.replace(/\/$|\/index\.html/i, "").substring(9);
window.location = u + "?p=" + p;
</script>
</head> </head>
<body data-prismjs-copy-timeout="1500"> <body data-prismjs-copy-timeout="1500">
<h2>What is it</h2> <h2>What is it</h2>
@@ -284,7 +291,7 @@
</sample-block> </sample-block>
</color-sample> </color-sample>
</color-samples> </color-samples>
<div class="tab-group" id="colors"> <tabset id="colors">
<div data-tab="css"> <div data-tab="css">
<pre class="language-css">:root { <pre class="language-css">:root {
--colour-blue: #2e51a1; --colour-blue: #2e51a1;
@@ -332,6 +339,6 @@
} }
}</pre> }</pre>
</div> </div>
</div> </tabset>
</body> </body>
</html> </html>

View File

@@ -2,6 +2,13 @@
<html> <html>
<head> <head>
<title>Pattern</title> <title>Pattern</title>
<script>
let u = document.location.href.substring(0, document.location.href.search(/patterns/i));
let p = document.location.pathname.substring(document.location.pathname.search(/patterns/i));
p = p.replace(/\/$|\/index\.html/i, "").substring(9);
window.location = u + "?p=" + p;
</script>
</head> </head>
<body data-prismjs-copy-timeout="1500"> <body data-prismjs-copy-timeout="1500">
<h2>What is it</h2> <h2>What is it</h2>
@@ -42,9 +49,61 @@ header
a(href="./")= site a(href="./")= site
// Other sections can go here, such as search and directory // Other sections can go here, such as search and directory
</pre> </pre>
<pre class="language-css" tab="css">header{display:-ms-grid;display:grid;-ms-grid-rows:1.75rem 3.5rem;grid-template-rows:1.75rem 3.5rem;-ms-grid-column:2;-ms-grid-column-span:2;grid-column:2/4;overflow:hidden}header svg{grid-column:1/-1;grid-row:1/-1;-ms-grid-row-align:stretch;-ms-grid-column-align:stretch;place-self:stretch}header svg text{-webkit-transform:translate(-1rem,7.25rem);-ms-transform:translate(-1rem,7.25rem);transform:translate(-1rem,7.25rem);font-size:10rem;font-weight:1000;font-family:sans-serif;fill:var(--colour-grey-xxl)}header>div{-ms-grid-row:2;grid-row:2;grid-column:1/-1;display:-ms-grid;display:grid;grid-column-gap:1rem;-ms-grid-columns:auto -webkit-max-content -webkit-max-content;-ms-grid-columns:auto max-content max-content;grid-template-columns:auto -webkit-max-content -webkit-max-content;grid-template-columns:auto max-content max-content}header>div .header-title h1{margin:0;padding:0 1rem}header>div .header-title h1 a,header>div .header-title h1 a:visited{border-bottom:none;color:var(--colour-black);font-family:sans-serif;font-size:2.5rem;font-size:32px;font-weight:700;margin:0;padding:0;text-decoration:none}</pre> <pre class="language-css" tab="css">header {
display: -ms-grid;
display: grid;
-ms-grid-rows: 1.75rem 3.5rem;
grid-template-rows: 1.75rem 3.5rem;
-ms-grid-column: 2;
-ms-grid-column-span: 2;
grid-column: 2/4;
overflow: hidden;
}
header svg {
grid-column: 1/-1;
grid-row: 1/-1;
-ms-grid-row-align: stretch;
-ms-grid-column-align: stretch;
place-self: stretch;
}
header svg text {
-webkit-transform: translate(-1rem, 7.25rem);
-ms-transform: translate(-1rem, 7.25rem);
transform: translate(-1rem, 7.25rem);
font-size: 10rem;
font-weight: 1000;
font-family: sans-serif;
fill: var(--colour-grey-xxl);
}
header > div {
-ms-grid-row: 2;
grid-row: 2;
grid-column: 1/-1;
display: -ms-grid;
display: grid;
grid-column-gap: 1rem;
-ms-grid-columns: auto -webkit-max-content -webkit-max-content;
-ms-grid-columns: auto max-content max-content;
grid-template-columns: auto -webkit-max-content -webkit-max-content;
grid-template-columns: auto max-content max-content;
}
header > div .header-title h1 {
margin: 0;
padding: 0 1rem;
}
header > div .header-title h1 a, header > div .header-title h1 a:visited {
border-bottom: none;
color: var(--colour-black);
font-family: sans-serif;
font-size: 2.5rem;
font-size: 32px;
font-weight: 700;
margin: 0;
padding: 0;
text-decoration: none;
}</pre>
<div class="language-sass" tab="scss"> <div class="language-sass" tab="scss">
<pre class="language-sass">@import "scss/core/header/header; <pre class="language-sass">@use "scss/core/header/header;
</pre> </pre>
<pre class="language-sass">//- DS2 core (c) 2024 Alexander McIlwraith <pre class="language-sass">//- DS2 core (c) 2024 Alexander McIlwraith
//- Licensed under CC BY-SA 4.0 //- Licensed under CC BY-SA 4.0

View File

@@ -2,9 +2,16 @@
<html> <html>
<head> <head>
<title>Pattern</title> <title>Pattern</title>
<script>
let u = document.location.href.substring(0, document.location.href.search(/patterns/i));
let p = document.location.pathname.substring(document.location.pathname.search(/patterns/i));
p = p.replace(/\/$|\/index\.html/i, "").substring(9);
window.location = u + "?p=" + p;
</script>
</head> </head>
<body data-prismjs-copy-timeout="1500"> <body data-prismjs-copy-timeout="1500">
<div class="tab-group" id="status-report"> <tabset id="status-report">
<div class="status-report status-report-structure" data-tab="by&amp;nbsp;structure"> <div class="status-report status-report-structure" data-tab="by&amp;nbsp;structure">
<table class="custom" role="presentation"> <table class="custom" role="presentation">
<tbody> <tbody>
@@ -13,32 +20,38 @@
</tr> </tr>
<tr> <tr>
<td><a href="./?p=this pattern doesn't exist"> This pattern doesn't exist</a></td> <td><a href="./?p=this pattern doesn't exist"> This pattern doesn't exist</a></td>
<td><span class="status-deprecated">Deprecated</span></td> <td><span class="status-deprecated">Deprecated</span>
</td>
</tr> </tr>
<tr> <tr>
<td colspan="2">Colours (1)</td> <td colspan="2">Colours (1)</td>
</tr> </tr>
<tr> <tr>
<td><a href="./?p=colours"> Colours</a></td> <td><a href="./?p=colours"> Colours</a></td>
<td><span class="status-complete">Complete</span></td> <td><span class="status-complete">Complete (Core)</span>
</td>
</tr> </tr>
<tr> <tr>
<td colspan="2">Components (4)</td> <td colspan="2">Components (4)</td>
</tr> </tr>
<tr> <tr>
<td><a href="./?p=components"> Components</a></td> <td><a href="./?p=components"> Components</a></td>
<td><span class="status-complete">Complete</span></td> <td><span class="status-complete">Complete</span>
</td>
<tr> <tr>
<td><a href="./?p=components/sticky-note"> Sticky note</a></td> <td><a href="./?p=components/sticky-note"> Sticky note</a></td>
<td><span class="status-complete">Complete</span></td> <td><span class="status-complete">Complete (Core)</span>
</td>
</tr> </tr>
<tr> <tr>
<td><a href="./?p=components/switch"> Switch</a></td> <td><a href="./?p=components/switch"> Switch</a></td>
<td><span class="status-complete">Complete</span></td> <td><span class="status-complete">Complete (Core)</span>
</td>
</tr> </tr>
<tr> <tr>
<td><a href="./?p=components/tooltip"> Tooltip</a></td> <td><a href="./?p=components/tooltip"> Tooltip</a></td>
<td><span class="status-complete">Complete</span></td> <td><span class="status-complete">Complete (Core)</span>
</td>
</tr> </tr>
</tr> </tr>
<tr> <tr>
@@ -46,18 +59,22 @@
</tr> </tr>
<tr> <tr>
<td><a href="./?p=layouts"> Layouts</a></td> <td><a href="./?p=layouts"> Layouts</a></td>
<td><span class="status-complete">Complete</span></td> <td><span class="status-complete">Complete (Core)</span>
</td>
<tr> <tr>
<td><a href="./?p=layouts/header"> Header</a></td> <td><a href="./?p=layouts/header"> Header</a></td>
<td><span class="status-complete">Complete</span></td> <td><span class="status-complete">Complete (Core)</span>
</td>
</tr> </tr>
<tr> <tr>
<td><a href="./?p=layouts/breakpoints"> Breakpoints</a></td> <td><a href="./?p=layouts/breakpoint"> Breakpoint</a></td>
<td><span class="status-complete">Complete</span></td> <td><span class="status-complete">Complete (Core)</span>
</td>
</tr> </tr>
<tr> <tr>
<td><a href="./?p=layouts/tabs"> Tabs</a></td> <td><a href="./?p=layouts/tabs"> Tabs</a></td>
<td><span class="status-complete">Complete</span></td> <td><span class="status-complete">Complete (Core)</span>
</td>
</tr> </tr>
</tr> </tr>
<tr> <tr>
@@ -65,7 +82,8 @@
</tr> </tr>
<tr> <tr>
<td><a href="./?p=status"> Status</a></td> <td><a href="./?p=status"> Status</a></td>
<td><span class="status-complete">Complete</span></td> <td><span class="status-complete">Complete (Core)</span>
</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
@@ -83,43 +101,63 @@
<td colspan="2"><span class="status-complete">Complete (10)</span></td> <td colspan="2"><span class="status-complete">Complete (10)</span></td>
</tr> </tr>
<tr> <tr>
<td> <a href="./?p=layouts/breakpoints">Breakpoints</a></td> <td> <a href="./?p=layouts/breakpoint">Breakpoint</a></td>
<td><span>(core)</span>
</td>
<td>Layouts</td> <td>Layouts</td>
</tr> </tr>
<tr> <tr>
<td> <a href="./?p=colours">Colours</a></td> <td> <a href="./?p=colours">Colours</a></td>
<td><span>(core)</span>
</td>
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
<td> <a href="./?p=components">Components</a></td> <td> <a href="./?p=components">Components</a></td>
<td>
</td>
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
<td> <a href="./?p=layouts/header">Header</a></td> <td> <a href="./?p=layouts/header">Header</a></td>
<td><span>(core)</span>
</td>
<td>Layouts</td> <td>Layouts</td>
</tr> </tr>
<tr> <tr>
<td> <a href="./?p=layouts">Layouts</a></td> <td> <a href="./?p=layouts">Layouts</a></td>
<td><span>(core)</span>
</td>
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
<td> <a href="./?p=status">Status</a></td> <td> <a href="./?p=status">Status</a></td>
<td><span>(core)</span>
</td>
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
<td> <a href="./?p=components/sticky-note">Sticky note</a></td> <td> <a href="./?p=components/sticky-note">Sticky note</a></td>
<td><span>(core)</span>
</td>
<td>Components</td> <td>Components</td>
</tr> </tr>
<tr> <tr>
<td> <a href="./?p=components/switch">Switch</a></td> <td> <a href="./?p=components/switch">Switch</a></td>
<td><span>(core)</span>
</td>
<td>Components</td> <td>Components</td>
</tr> </tr>
<tr> <tr>
<td> <a href="./?p=layouts/tabs">Tabs</a></td> <td> <a href="./?p=layouts/tabs">Tabs</a></td>
<td><span>(core)</span>
</td>
<td>Layouts</td> <td>Layouts</td>
</tr> </tr>
<tr> <tr>
<td> <a href="./?p=components/tooltip">Tooltip</a></td> <td> <a href="./?p=components/tooltip">Tooltip</a></td>
<td><span>(core)</span>
</td>
<td>Components</td> <td>Components</td>
</tr> </tr>
<tr> <tr>
@@ -127,6 +165,8 @@
</tr> </tr>
<tr> <tr>
<td> <a href="./?p=this pattern doesn't exist">This pattern doesn't exist</a></td> <td> <a href="./?p=this pattern doesn't exist">This pattern doesn't exist</a></td>
<td>
</td>
<td></td> <td></td>
</tr> </tr>
</tbody> </tbody>
@@ -136,63 +176,63 @@
<table role="presentation"> <table role="presentation">
<tbody> <tbody>
<tr> <tr>
<td> <a href="./?p=layouts/breakpoints">Breakpoints</a></td> <td> <a href="./?p=layouts/breakpoint">Breakpoint</a></td>
<td><span><span class="status-complete">Complete</span></span></td> <td><span> <span class="status-complete">Complete (Core)</span></span></td>
<td>Layouts</td> <td>Layouts</td>
</tr> </tr>
<tr> <tr>
<td> <a href="./?p=colours">Colours</a></td> <td> <a href="./?p=colours">Colours</a></td>
<td><span><span class="status-complete">Complete</span></span></td> <td><span> <span class="status-complete">Complete (Core)</span></span></td>
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
<td> <a href="./?p=components">Components</a></td> <td> <a href="./?p=components">Components</a></td>
<td><span><span class="status-complete">Complete</span></span></td> <td><span> <span class="status-complete">Complete</span></span></td>
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
<td> <a href="./?p=layouts/header">Header</a></td> <td> <a href="./?p=layouts/header">Header</a></td>
<td><span><span class="status-complete">Complete</span></span></td> <td><span> <span class="status-complete">Complete (Core)</span></span></td>
<td>Layouts</td> <td>Layouts</td>
</tr> </tr>
<tr> <tr>
<td> <a href="./?p=layouts">Layouts</a></td> <td> <a href="./?p=layouts">Layouts</a></td>
<td><span><span class="status-complete">Complete</span></span></td> <td><span> <span class="status-complete">Complete (Core)</span></span></td>
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
<td> <a href="./?p=status">Status</a></td> <td> <a href="./?p=status">Status</a></td>
<td><span><span class="status-complete">Complete</span></span></td> <td><span> <span class="status-complete">Complete (Core)</span></span></td>
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
<td> <a href="./?p=components/sticky-note">Sticky note</a></td> <td> <a href="./?p=components/sticky-note">Sticky note</a></td>
<td><span><span class="status-complete">Complete</span></span></td> <td><span> <span class="status-complete">Complete (Core)</span></span></td>
<td>Components</td> <td>Components</td>
</tr> </tr>
<tr> <tr>
<td> <a href="./?p=components/switch">Switch</a></td> <td> <a href="./?p=components/switch">Switch</a></td>
<td><span><span class="status-complete">Complete</span></span></td> <td><span> <span class="status-complete">Complete (Core)</span></span></td>
<td>Components</td> <td>Components</td>
</tr> </tr>
<tr> <tr>
<td> <a href="./?p=layouts/tabs">Tabs</a></td> <td> <a href="./?p=layouts/tabs">Tabs</a></td>
<td><span><span class="status-complete">Complete</span></span></td> <td><span> <span class="status-complete">Complete (Core)</span></span></td>
<td>Layouts</td> <td>Layouts</td>
</tr> </tr>
<tr> <tr>
<td> <a href="./?p=this pattern doesn't exist">This pattern doesn't exist</a></td> <td> <a href="./?p=this pattern doesn't exist">This pattern doesn't exist</a></td>
<td><span><span class="status-deprecated">Deprecated</span></span></td> <td><span> <span class="status-deprecated">Deprecated</span></span></td>
<td></td> <td></td>
</tr> </tr>
<tr> <tr>
<td> <a href="./?p=components/tooltip">Tooltip</a></td> <td> <a href="./?p=components/tooltip">Tooltip</a></td>
<td><span><span class="status-complete">Complete</span></span></td> <td><span> <span class="status-complete">Complete (Core)</span></span></td>
<td>Components</td> <td>Components</td>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div> </div>
</div> </tabset>
</body> </body>
</html> </html>

View File

@@ -2,6 +2,13 @@
<html> <html>
<head> <head>
<title>Pattern</title> <title>Pattern</title>
<script>
let u = document.location.href.substring(0, document.location.href.search(/patterns/i));
let p = document.location.pathname.substring(document.location.pathname.search(/patterns/i));
p = p.replace(/\/$|\/index\.html/i, "").substring(9);
window.location = u + "?p=" + p;
</script>
</head> </head>
<body data-prismjs-copy-timeout="1500"> <body data-prismjs-copy-timeout="1500">
<h2>What is it</h2> <h2>What is it</h2>
@@ -19,10 +26,135 @@
<sticky-note class="blue" float="right">This <strong>is</strong> a sample sticky. You can drag it out of the way if you need to see the content under it.</sticky-note></pre> <sticky-note class="blue" float="right">This <strong>is</strong> a sample sticky. You can drag it out of the way if you need to see the content under it.</sticky-note></pre>
<pre class="language-pug" tab="pug">sticky-note(float="right").blue This #[strong is] a sample sticky. <pre class="language-pug" tab="pug">sticky-note(float="right").blue This #[strong is] a sample sticky.
| You can drag it out of the way if you need to see the content under it.</pre> | You can drag it out of the way if you need to see the content under it.</pre>
<pre class="language-css" data-tab="css"> @import url("https://fonts.googleapis.com/css2?family=Kalam:wght@300;400;700&display=swap");sticky-note-wrapper{-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid transparent;border-radius:50%;display:inline-block;height:0.5rem;position:relative;width:0.5rem}sticky-note-wrapper *{-webkit-box-sizing:border-box;box-sizing:border-box}sticky-note-wrapper sticky-note{cursor:-webkit-grab;cursor:grab;display:-ms-grid;display:grid;float:left;font-size:1rem;height:13rem;left:0;place-items:stretch;position:absolute;top:0;width:13rem;z-index:100}sticky-note-wrapper sticky-note:active{cursor:-webkit-grabbing;cursor:grabbing;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}sticky-note-wrapper sticky-note.right{float:right}sticky-note-wrapper sticky-note>div{-ms-grid-row:1;grid-row:1;-ms-grid-column:1;grid-column:1}sticky-note-wrapper sticky-note>div:first-child{background-color:rgba(0,0,0,0.25);-webkit-box-shadow:-2px 2px 15px 0 rgba(0,0,0,0.5);box-shadow:-2px 2px 15px 0 rgba(0,0,0,0.5);display:-ms-grid;display:grid;margin:2rem 1rem 0.25rem 0.36rem;width:calc(100% - 1rem)}sticky-note-wrapper sticky-note>div:nth-child(2){clip-path:url(#stickyClip);display:-ms-grid;display:grid;font-family:"Kalam",cursive;font-style:1rem;font-weight:300;line-height:1.25rem;padding:1rem;place-items:center;text-align:center}sticky-note-wrapper sticky-note>div:nth-child(2)>*{font-family:"Kalam",cursive!important;font-style:normal!important;font-weight:300!important}@media screen and (max-width:1024px){sticky-note-wrapper sticky-note>div:nth-child(2){max-width:13rem;min-width:13rem;width:1rem}}@media screen and (max-width:768px){sticky-note-wrapper sticky-note>div:nth-child(2){font-size:1.75rem;max-width:21rem;min-height:21rem}}@media screen and (max-width:640px){sticky-note-wrapper sticky-note>div:nth-child(2){font-size:2.5rem;max-width:26rem;min-height:26rem}}sticky-note-wrapper sticky-note>div:nth-child(2){background:-webkit-gradient(linear,left top,left bottom,from(#ffffdd),color-stop(2%,#ffffd3),color-stop(12%,#ffffd3),color-stop(75%,#ffffc9),to(#ffffba));background:linear-gradient(180deg,#ffffdd 0%,#ffffd3 2%,#ffffd3 12%,#ffffc9 75%,#ffffba 100%)}sticky-note-wrapper sticky-note.blue>div:nth-child(2){background:-webkit-gradient(linear,left top,left bottom,from(#9dddec),color-stop(2%,#94daea),color-stop(12%,#94daea),color-stop(75%,#8bd7e8),to(#7fd3e6));background:linear-gradient(180deg,#9dddec 0%,#94daea 2%,#94daea 12%,#8bd7e8 75%,#7fd3e6 100%)}sticky-note-wrapper sticky-note.pink>div:nth-child(2){background:-webkit-gradient(linear,left top,left bottom,from(#fa7c93),color-stop(2%,#fa728b),color-stop(12%,#fa728b),color-stop(75%,#fa6883),to(#f95977));background:linear-gradient(180deg,#fa7c93 0%,#fa728b 2%,#fa728b 12%,#fa6883 75%,#f95977 100%)}sticky-note-wrapper sticky-note.green>div:nth-child(2){background:-webkit-gradient(linear,left top,left bottom,from(#c5fcc9),color-stop(2%,#bbfbc0),color-stop(12%,#bbfbc0),color-stop(75%,#b1fab7),to(#a3faaa));background:linear-gradient(180deg,#c5fcc9 0%,#bbfbc0 2%,#bbfbc0 12%,#b1fab7 75%,#a3faaa 100%)}sticky-note-wrapper:has(sticky-note:hover){background-color:#ffffd3;border:1px solid black}sticky-note-wrapper:has(sticky-note.yellow:hover){background-color:#ffffd3}sticky-note-wrapper:has(sticky-note.blue:hover){background-color:#94daea}sticky-note-wrapper:has(sticky-note.pink:hover){background-color:#fa728b}sticky-note-wrapper:has(sticky-note.green:hover){background-color:#bbfbc0}</pre> <pre class="language-css" data-tab="css"> sticky-note-wrapper {
-webkit-box-sizing: border-box;
box-sizing: border-box;
border: 1px solid transparent;
border-radius: 50%;
display: inline-block;
height: 0.5rem;
position: relative;
width: 0.5rem;
}
sticky-note-wrapper * {
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
sticky-note-wrapper sticky-note {
cursor: -webkit-grab;
cursor: grab;
display: -ms-grid;
display: grid;
float: left;
font-size: 1rem;
height: 13rem;
left: 0;
place-items: stretch;
position: absolute;
top: 0;
width: 13rem;
z-index: 100;
}
sticky-note-wrapper sticky-note:active {
cursor: -webkit-grabbing;
cursor: grabbing;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
sticky-note-wrapper sticky-note.right {
float: right;
}
sticky-note-wrapper sticky-note > div {
-ms-grid-row: 1;
grid-row: 1;
-ms-grid-column: 1;
grid-column: 1;
}
sticky-note-wrapper sticky-note > div:nth-child(1) {
background-color: rgba(0, 0, 0, 0.25);
-webkit-box-shadow: -2px 2px 15px 0 rgba(0, 0, 0, 0.5);
box-shadow: -2px 2px 15px 0 rgba(0, 0, 0, 0.5);
display: -ms-grid;
display: grid;
margin: 2rem 1rem 0.25rem 0.36rem;
width: calc(100% - 1rem);
}
sticky-note-wrapper sticky-note > div:nth-child(2) {
clip-path: url(#stickyClip);
display: -ms-grid;
display: grid;
font-family: "Kalam", cursive;
font-style: 1rem;
font-weight: 300;
line-height: 1.25rem;
padding: 1rem;
place-items: center;
text-align: center;
}
sticky-note-wrapper sticky-note > div:nth-child(2) > * {
font-family: "Kalam", cursive !important;
font-style: normal !important;
font-weight: 300 !important;
}
@media screen and (max-width: 1024px) {
sticky-note-wrapper sticky-note > div:nth-child(2) {
max-width: 13rem;
min-width: 13rem;
width: 1rem;
}
}
@media screen and (max-width: 768px) {
sticky-note-wrapper sticky-note > div:nth-child(2) {
font-size: 1.75rem;
max-width: 21rem;
min-height: 21rem;
}
}
@media screen and (max-width: 640px) {
sticky-note-wrapper sticky-note > div:nth-child(2) {
font-size: 2.5rem;
max-width: 26rem;
min-height: 26rem;
}
}
sticky-note-wrapper sticky-note > div:nth-child(2) {
background: -webkit-gradient(linear, left top, left bottom, from(rgb(255, 255, 221.2)), color-stop(2%, #ffffd3), color-stop(12%, #ffffd3), color-stop(75%, rgb(255, 255, 200.8)), to(rgb(255, 255, 185.5)));
background: linear-gradient(180deg, rgb(255, 255, 221.2) 0%, #ffffd3 2%, #ffffd3 12%, rgb(255, 255, 200.8) 75%, rgb(255, 255, 185.5) 100%);
}
sticky-note-wrapper sticky-note.blue > div:nth-child(2) {
background: -webkit-gradient(linear, left top, left bottom, from(rgb(156.5265625, 220.9484375, 235.6734375)), color-stop(2%, #94daea), color-stop(12%, #94daea), color-stop(75%, rgb(139.4734375, 215.0515625, 232.3265625)), to(rgb(126.68359375, 210.62890625, 229.81640625)));
background: linear-gradient(180deg, rgb(156.5265625, 220.9484375, 235.6734375) 0%, #94daea 2%, #94daea 12%, rgb(139.4734375, 215.0515625, 232.3265625) 75%, rgb(126.68359375, 210.62890625, 229.81640625) 100%);
}
sticky-note-wrapper sticky-note.pink > div:nth-child(2) {
background: -webkit-gradient(linear, left top, left bottom, from(rgb(250.3493150685, 123.8506849315, 147.104109589)), color-stop(2%, #fa728b), color-stop(12%, #fa728b), color-stop(75%, rgb(249.6506849315, 104.1493150685, 130.895890411)), to(rgb(249.1267123288, 89.3732876712, 118.7397260274)));
background: linear-gradient(180deg, rgb(250.3493150685, 123.8506849315, 147.104109589) 0%, #fa728b 2%, #fa728b 12%, rgb(249.6506849315, 104.1493150685, 130.895890411) 75%, rgb(249.1267123288, 89.3732876712, 118.7397260274) 100%);
}
sticky-note-wrapper sticky-note.green > div:nth-child(2) {
background: -webkit-gradient(linear, left top, left bottom, from(rgb(196.6333333333, 251.5666666667, 200.925)), color-stop(2%, #bbfbc0), color-stop(12%, #bbfbc0), color-stop(75%, rgb(177.3666666667, 250.4333333333, 183.075)), to(rgb(162.9166666667, 249.5833333333, 169.6875)));
background: linear-gradient(180deg, rgb(196.6333333333, 251.5666666667, 200.925) 0%, #bbfbc0 2%, #bbfbc0 12%, rgb(177.3666666667, 250.4333333333, 183.075) 75%, rgb(162.9166666667, 249.5833333333, 169.6875) 100%);
}
sticky-note-wrapper:has(sticky-note:hover) {
background-color: #ffffd3;
border: 1px solid black;
}
sticky-note-wrapper:has(sticky-note.yellow:hover) {
background-color: #ffffd3;
}
sticky-note-wrapper:has(sticky-note.blue:hover) {
background-color: #94daea;
}
sticky-note-wrapper:has(sticky-note.pink:hover) {
background-color: #fa728b;
}
sticky-note-wrapper:has(sticky-note.green:hover) {
background-color: #bbfbc0;
}</pre>
<div tab="scss"> <div tab="scss">
<h2>Example</h2>
<pre class="language-sass">$sticky-colors: ( [sass map with your own defined colours] ); <pre class="language-sass">$sticky-colors: ( [sass map with your own defined colours] );
@import "scss/core/switch/_sticky-note"; @use "scss/core/switch/_sticky-note";
@include sticky-note; @include sticky-note;
</pre> </pre>
<pre class="language-sass">//- DS2 core (c) 2024 Alexander McIlwraith <pre class="language-sass">//- DS2 core (c) 2024 Alexander McIlwraith
@@ -31,7 +163,7 @@
@use 'sass:color'; @use 'sass:color';
@use "sass:map"; @use "sass:map";
@use 'sass:list'; @use 'sass:list';
@import url('https://fonts.googleapis.com/css2?family=Kalam:wght@300;400;700&display=swap'); // @import url('https://fonts.googleapis.com/css2?family=Kalam:wght@300;400;700&display=swap');
$sticky-colors: ( $sticky-colors: (
"yellow": #ffffd3, "yellow": #ffffd3,
@@ -139,34 +271,52 @@ $sticky-colors: (
// default colour // default colour
> div:nth-child(2) { > div:nth-child(2) {
$sticky-color: nth(map.values($sticky-colors), 1); $sticky-color: list.nth(map.values($sticky-colors), 1);
// background: linear-gradient(
// 180deg,
// lighten($sticky-color, 2%) 0%,
// $sticky-color 2%,
// $sticky-color 12%,
// darken($sticky-color, 2%) 75%,
// darken($sticky-color, 5%) 100%
// );
background: linear-gradient( background: linear-gradient(
180deg, 180deg,
lighten($sticky-color, 2%) 0%, color.adjust($sticky-color, $lightness: 2%) 0%,
$sticky-color 2%, $sticky-color 2%,
$sticky-color 12%, $sticky-color 12%,
darken($sticky-color, 2%) 75%, color.adjust($sticky-color, $lightness: -2%) 75%,
darken($sticky-color, 5%) 100% color.adjust($sticky-color, $lightness: -5%) 100%
); );
} }
// all class colors // all class colors
@each $class, $sticky-color in $sticky-colors { @each $class, $sticky-color in $sticky-colors {
&.#{$class} > div:nth-child(2) { &.#{$class} > div:nth-child(2) {
@if $class != nth(map.keys($sticky-colors), 1) { @if $class != list.nth(map.keys($sticky-colors), 1) {
background: linear-gradient( background: linear-gradient(
180deg, 180deg,
lighten($sticky-color, 2%) 0%, color.adjust($sticky-color, $lightness: 2%) 0%,
$sticky-color 2%, $sticky-color 2%,
$sticky-color 12%, $sticky-color 12%,
darken($sticky-color, 2%) 75%, color.adjust($sticky-color, $lightness: -2%) 75%,
darken($sticky-color, 5%) 100% color.adjust($sticky-color, $lightness: -5%) 100%
); );
// background: linear-gradient(
// 180deg,
// lighten($sticky-color, 2%) 0%,
// $sticky-color 2%,
// $sticky-color 12%,
// darken($sticky-color, 2%) 75%,
// darken($sticky-color, 5%) 100%
// );
} }
} }
} }
} }
&:has(sticky-note:hover) { &:has(sticky-note:hover) {
background-color: #{nth(map.values($sticky-colors), 1)}; background-color: #{list.nth(map.values($sticky-colors), 1)};
border: 1px solid black; border: 1px solid black;
} }
@@ -179,6 +329,7 @@ $sticky-colors: (
}</pre> }</pre>
</div> </div>
<div tab="js"> <div tab="js">
<h2>Example</h2>
<pre class="language-js">import * as stickynote from ""./js/core/sticky-note/_sticky-note.js"; <pre class="language-js">import * as stickynote from ""./js/core/sticky-note/_sticky-note.js";
stickynote.init() stickynote.init()
</pre> </pre>
@@ -279,38 +430,40 @@ const calculateStickyPosition = (s) => {
} }
} }
export function init(p = document){ module.exports = {
font.size = parseFloat(getComputedStyle(document.documentElement).fontSize.replace("px","")); init: (p = document) => {
p.querySelectorAll("sticky-note").forEach((s) => {
if (s.querySelectorAll("svg").length == 0) {
let wrapper = document.createElement("sticky-note-wrapper");
s.parentNode.insertBefore(wrapper, s);
wrapper.appendChild(s);
s.setAttribute("content", s.innerHTML.replace(/"/g, "\""));
s.innerHTML = `<div><svg width='0' height='0'><defs><clipPath id='stickyClip' clipPathUnits='objectBoundingBox'><path d='M 0 0 Q 0 0.69, 0.03 0.96 0.03 0.96, 1 0.96 Q 0.96 0.69, 0.96 0 0.96 0, 0 0' stroke-linejoin='round' stroke-linecap='square' /></clipPath></defs></svg></div><div><div>${s.innerHTML}</div></div>`;
}
calculateStickyPosition(s);
drag(s);
s.ondblclick = (e) => {
if (e.ctrlKey) {
calculateStickyPosition(s);
} else {
// add one click select
}
}
})
window.onresize = () => {
font.size = parseFloat(getComputedStyle(document.documentElement).fontSize.replace("px","")); font.size = parseFloat(getComputedStyle(document.documentElement).fontSize.replace("px",""));
let stickies = p.querySelectorAll("sticky-note");
stickies.forEach((s) => { p.querySelectorAll("sticky-note").forEach((s) => {
if (s.querySelectorAll("svg").length == 0) {
let wrapper = document.createElement("sticky-note-wrapper");
s.parentNode.insertBefore(wrapper, s);
wrapper.appendChild(s);
s.setAttribute("content", s.innerHTML.replace(/"/g, "\""));
s.innerHTML = `<div><svg width='0' height='0'><defs><clipPath id='stickyClip' clipPathUnits='objectBoundingBox'><path d='M 0 0 Q 0 0.69, 0.03 0.96 0.03 0.96, 1 0.96 Q 0.96 0.69, 0.96 0 0.96 0, 0 0' stroke-linejoin='round' stroke-linecap='square' /></clipPath></defs></svg></div><div><div>${s.innerHTML}</div></div>`;
}
calculateStickyPosition(s); calculateStickyPosition(s);
}); drag(s);
s.ondblclick = (e) => {
if (e.ctrlKey) {
calculateStickyPosition(s);
} else {
// add one click select
}
}
})
window.onresize = () => {
font.size = parseFloat(getComputedStyle(document.documentElement).fontSize.replace("px",""));
let stickies = p.querySelectorAll("sticky-note");
stickies.forEach((s) => {
calculateStickyPosition(s);
});
}
} }
}</pre> }</pre>
</div> </div>

View File

@@ -2,6 +2,13 @@
<html> <html>
<head> <head>
<title>Pattern</title> <title>Pattern</title>
<script>
let u = document.location.href.substring(0, document.location.href.search(/patterns/i));
let p = document.location.pathname.substring(document.location.pathname.search(/patterns/i));
p = p.replace(/\/$|\/index\.html/i, "").substring(9);
window.location = u + "?p=" + p;
</script>
</head> </head>
<body data-prismjs-copy-timeout="1500"> <body data-prismjs-copy-timeout="1500">
<h2>What is it</h2> <h2>What is it</h2>
@@ -15,12 +22,38 @@
<p class="switch"> <p class="switch">
<label for="example-switch">Switch label (states the on state)</label><span id="example-switch" role="switch"></span> <label for="example-switch">Switch label (states the on state)</label><span id="example-switch" role="switch"></span>
</p> </p>
<div class="tab-group" id="switches"> <tabset id="switches">
<pre class="language-html" tab="html"><span id="example-id" role="switch"></span></pre> <pre class="language-html" tab="html"><span id="example-id" role="switch"></span></pre>
<pre class="language-pug" tab="pug">span#example-id(role="switch")</pre> <pre class="language-pug" tab="pug">span#example-id(role="switch")</pre>
<pre class="language-css" tab="css">[role=switch]{display:-ms-inline-grid;display:inline-grid;border:1px solid #2e51a1;background-color:#d8d8d8;border-radius:0.75rem;height:1.5rem;width:3rem;-webkit-transition:all 500ms;transition:all 500ms}[role=switch]>span{display:inline-block;background-color:white;border-radius:50%;margin:2%;width:calc(1.5rem - 2%);-webkit-transition:all 500ms;transition:all 500ms}[role=switch][aria-checked=true]{background-color:#2e51a1}[role=switch][aria-checked=true]>span{margin-left:calc(1.5rem - 5%)}</pre> <pre class="language-css" tab="css">[role=switch] {
display: -ms-inline-grid;
display: inline-grid;
border: 1px solid #2e51a1;
background-color: #d8d8d8;
border-radius: 0.75rem;
height: 1.5rem;
width: 3rem;
-webkit-transition: all 500ms;
transition: all 500ms;
}
[role=switch] > span {
display: inline-block;
background-color: white;
border-radius: 50%;
margin: 2%;
width: calc(1.5rem - 2%);
-webkit-transition: all 500ms;
transition: all 500ms;
}
[role=switch][aria-checked=true] {
background-color: #2e51a1;
}
[role=switch][aria-checked=true] > span {
margin-left: calc(1.5rem - 5%);
}</pre>
<div tab="scss"> <div tab="scss">
<pre class="language-sass">@import "scss/core/switch/_switch"; <h2>Example</h2>
<pre class="language-sass">@use "scss/core/switch/_switch";
@include switch; @include switch;
</pre> </pre>
<pre class="language-sass">//- DS2 core (c) 2024 Alexander McIlwraith <pre class="language-sass">//- DS2 core (c) 2024 Alexander McIlwraith
@@ -61,6 +94,7 @@ $switch-height: 1.5rem !default;
}</pre> }</pre>
</div> </div>
<div tab="js"> <div tab="js">
<h2>Example</h2>
<pre class="language-js">// Note that switch is a reserved word. <pre class="language-js">// Note that switch is a reserved word.
import * as swtch from "./js/core/switch/_switch.js"; import * as swtch from "./js/core/switch/_switch.js";
swtch.init(); swtch.init();
@@ -97,6 +131,6 @@ module.exports = {
} }
</pre> </pre>
</div> </div>
</div> </tabset>
</body> </body>
</html> </html>

View File

@@ -23,67 +23,64 @@
</ul> </ul>
<p>Users should not need to see content of multiple tabs simultaneously and the user should be able to easily recognise where they are within the content. </p> <p>Users should not need to see content of multiple tabs simultaneously and the user should be able to easily recognise where they are within the content. </p>
<h2>How to use it</h2> <h2>How to use it</h2>
<p>The structure of the tab set is defined in html. There are two forms supported. Adding a class of <code class="inline">.tab-group</code> to the container element will work in place of the <code class="inline">tabset</code> tag, and the tab panels can be defined using either <code class="inline">tab=""</code> or <code class="inline">data-tab=""</code>. Passing an optional element to the init function will initialise tabs within that element. </p> <p>The structure of the tab set is defined in html. There are two forms supported. Adding a class of <code class="inline">.tab-group</code> to the container element will work in place of the <code class="inline">tabset</code> tag, and the tab panels can be defined using either <code class="inline">tab=""</code> or <code class="inline">data-tab=""</code>. Passing an optional element to the init function will initialise tabs within that element. Adding a <code class="inline">order=""</code> or <code class="inline">data-order=""</code> element to the tabset you can have the tabs sorted in a consistent order across tabsets.</p>
<p>The tab initalize function now takes a new function parameter in the form of an third argument is an object that can take the following callbacks: </p> <h2>Example</h2>
<ul> <pre class="language-pug" tab="pug">tabset(order="tab2, tab1")
<li>altModifer (When the altKey is used)</li> div(tab="tab1")
<li>shiftModifier (When the shift key is used)</li> div(tab="tab2")
<li>metaModifier (When the Windows key or Apple key is used)</li> </pre>
</ul>
<p>You can use these callbacks to create a custom event to get the tab information. </p>
<p>Note: There is a new core function (core.getTabPath) that will generate the query string and url hash for use in DS2 Core. You may wish to update your scaffolding.js file to make use of this functionality. </p>
<tabset id="tabs"> <tabset id="tabs">
<pre class="language-html" tab="html"> <pre class="language-html" tab="html">
<tabset id="uniqueID"> <tabset id="uniqueID" order="tab title 2,tab title 1">
<div tab="[tab title]"></div> <div tab="[tab title 1]"></div>
<div tab="[tab title]"></div> <div tab="[tab title 2]"></div>
</tabset></pre> </tabset></pre>
<pre class="language-pug" tab="pug">tabset#uniqueID <pre class="language-pug" tab="pug">tabset#uniqueID(order="tab title 2,tab title 1")
div(tab="[tab title]") div(tab="[tab title 1]")
div(tab="[tab title]") div(tab="[tab title 2]")
</pre> </pre>
<pre class="language-css" tab="css">tabset, .tab-group { <pre class="language-css" tab="css">tabset, .tab-group {
margin: 2rem 0 1rem 0; margin: 2rem 0 1rem 0;
} }
tabset > ul, .tab-group > ul { tabset [role=tablist], .tab-group [role=tablist] {
display: -webkit-box; display: -webkit-box;
display: -ms-flexbox; display: -ms-flexbox;
display: flex; display: flex;
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
tabset > ul li.separator, .tab-group > ul li.separator { tabset [role=tablist] li.separator, .tab-group [role=tablist] li.separator {
border-bottom: 1px solid #7f7f7f; border-bottom: 1px solid #7f7f7f;
border-left: 1px solid #7f7f7f;
display: inline-block; display: inline-block;
margin: 0.45rem 0 0 0; margin: 0.45rem 0 0 0;
width: 100%; width: 100%;
} }
tabset .tab-hidden, .tab-group .tab-hidden { tabset [role=tablist] li[role=tab], .tab-group [role=tablist] li[role=tab] {
display: none;
}
tabset [role=tab], .tab-group [role=tab] {
background-color: #FFF; background-color: #FFF;
border-left: 1px solid #7f7f7f; border-left: 1px solid #7f7f7f;
border-top: 1px solid #7f7f7f; border-right: 1px solid #7f7f7f;
border-radius: 0.5rem 0.5rem 0 0; border-radius: 0.5rem 0.5rem 0 0;
border-top: 1px solid #7f7f7f;
cursor: pointer; cursor: pointer;
margin: 0;
display: inline; display: inline;
margin: 0;
padding: 1rem 1.5rem 0.14rem 1.5rem; padding: 1rem 1.5rem 0.14rem 1.5rem;
z-index: 2; z-index: 2;
} }
tabset [role=tab]:last-of-type, .tab-group [role=tab]:last-of-type { tabset [role=tablist] li[role=tab]:last-of-type, .tab-group [role=tablist] li[role=tab]:last-of-type {
border-right: 1px solid #7f7f7f; border-right: 1px solid #7f7f7f;
} }
tabset [role=tab]:not(.selected), .tab-group [role=tab]:not(.selected) { tabset [role=tablist] li[role=tab]:not(.selected), .tab-group [role=tablist] li[role=tab]:not(.selected) {
background-color: #f0f0f0; background-color: #f0f0f0;
border-bottom: 1px solid #7f7f7f; border-bottom: 1px solid #7f7f7f;
} }
tabset [role=tab] span, .tab-group [role=tab] span { tabset [role=tablist] li[role=tab] span, .tab-group [role=tablist] li[role=tab] span {
display: block; display: block;
margin: 0 0 0.5rem 0; margin: 0 0 0.5rem 0;
} }
tabset .tab-hidden, .tab-group .tab-hidden {
display: none;
}
tabset [role=tabpanel], .tab-group [role=tabpanel] { tabset [role=tabpanel], .tab-group [role=tabpanel] {
background-color: #FFF; background-color: #FFF;
border: 1px solid #7f7f7f; border: 1px solid #7f7f7f;
@@ -95,7 +92,8 @@ tabset [role=tabpanel]:not(.open), .tab-group [role=tabpanel]:not(.open) {
display: none; display: none;
}</pre> }</pre>
<div tab="scss"> <div tab="scss">
<pre class="language-sass">@import "scss/core/tabs/_tabs"; <h2>Example</h2>
<pre class="language-sass">@use "scss/core/tabs/_tabs";
@include tabs{ @include tabs{
// optional content block // optional content block
}; };
@@ -104,23 +102,59 @@ tabset [role=tabpanel]:not(.open), .tab-group [role=tabpanel]:not(.open) {
// Licensed under CC BY-SA 4.0 // Licensed under CC BY-SA 4.0
$tab-border: #7f7f7f !default; $tab-border: #7f7f7f !default;
$tab-panel-background-color: #FFF !default;
$tab-panel-top-border: #7f7f7f !default;
$tab-panel-top-border-width: 1px !default;
$tab-selected: #FFF !default; $tab-selected: #FFF !default;
$tab-selected-text: #000 !default;
$tab-notselected: #f0f0f0 !default; $tab-notselected: #f0f0f0 !default;
$tab-notselected-text: #000 !default;
@mixin tabs { @mixin tabs {
tabset, .tab-group { tabset, .tab-group {
margin: 2rem 0 1rem 0; margin: 2rem 0 1rem 0;
> ul {
[role="tablist"] {
display: flex; display: flex;
margin: 0; margin: 0;
padding: 0; padding: 0;
li.separator {
border-bottom: 1px solid $tab-border; li {
border-left: 1px solid $tab-border; &.separator {
display: inline-block; border-bottom: 1px solid $tab-border;
margin: .45rem 0 0 0; display: inline-block;
width: 100%; margin: .45rem 0 0 0;
width: 100%;
}
&[role="tab"] {
background-color: $tab-selected;
border-left: 1px solid $tab-border;
border-right: 1px solid $tab-border;
border-radius: .5rem .5rem 0 0;
border-top: 1px solid $tab-border;
cursor:pointer;
display: inline;
margin: 0;
padding: 1rem 1.5rem .14rem 1.5rem;
z-index: 2;
&:last-of-type {
border-right: 1px solid $tab-border;
}
&:not(.selected) {
background-color: $tab-notselected;
border-bottom: 1px solid $tab-border;
/// color
}
span {
display: block;
margin: 0 0 .5rem 0;
}
}
} }
} }
@@ -128,32 +162,6 @@ $tab-notselected: #f0f0f0 !default;
display: none; display: none;
} }
[role="tab"] {
background-color: $tab-selected;
border-left: 1px solid $tab-border;
border-top: 1px solid $tab-border;
border-radius: .5rem .5rem 0 0;
cursor:pointer;
margin: 0;
display: inline;
padding: 1rem 1.5rem .14rem 1.5rem;
z-index: 2;
&:last-of-type {
border-right: 1px solid $tab-border;
}
&:not(.selected) {
background-color: $tab-notselected;
border-bottom: 1px solid $tab-border;
}
span {
display: block;
margin: 0 0 .5rem 0;
}
}
[role="tabpanel"] { [role="tabpanel"] {
background-color: $tab-selected; background-color: $tab-selected;
border: 1px solid $tab-border; border: 1px solid $tab-border;
@@ -164,13 +172,13 @@ $tab-notselected: #f0f0f0 !default;
&:not(.open) { &:not(.open) {
display: none; display: none;
} }
@content;
} }
@content;
} }
}</pre> }</pre>
</div> </div>
<div tab="js"> <div tab="js">
<h2>Example</h2>
<pre class="language-js">import * as tabs from "./js/core/tabs/_tabs.js"; <pre class="language-js">import * as tabs from "./js/core/tabs/_tabs.js";
tabs.init();</pre> tabs.init();</pre>
<pre class="language-js">/* DS2 core (c) 2024 Alexander McIlwraith <pre class="language-js">/* DS2 core (c) 2024 Alexander McIlwraith
@@ -205,28 +213,62 @@ const waitForElement = (selector) => {
}); });
} }
const chooseTab = (tab) => {
const siblings = Array.from(tab.parentNode.children);
siblings.forEach(sibling => sibling.classList.remove("selected"));
tab.classList.add("selected");
const tabPanels = Array.from(tab.parentNode.parentNode.children)
tabPanels.forEach(panel => panel.classList.remove("open"));
const tabPanelId = tab.getAttribute("id").replace("tab", "tab-panel");
document.getElementById(tabPanelId).classList.add("open");
}
let pushState = 0;
let tabsetCount = 0;
export function init(container = document, spacer = true, args = {}) { export function init(container = document, spacer = true, args = {}) {
container.querySelectorAll(".tab-group, tabset").forEach(tabGroup => { container.querySelectorAll(".tab-group, tabset").forEach(tabGroup => {
if (tabGroup.querySelector("[role=tablist]") === null) { if (tabGroup.querySelector("[role=tablist]") === null) {
if (tabGroup.getAttribute("id") == null) {
tabGroup.setAttribute("id", "tab-group-" + tabsetCount);
tabsetCount++;
}
const tabgroup = tabGroup.getAttribute("id"); const tabgroup = tabGroup.getAttribute("id");
let tablist = ""; let tablist = "";
Array.from(tabGroup.children).forEach(child => { Array.from(tabGroup.children).forEach(child => {
const tab = child.getAttribute("tab") || child.getAttribute("data-tab");
// is details?
let dtls = child.nodeName == "DETAILS" ? true : false;
// get the tab text
let tab = dtls ? child.querySelector("summary").innerHTML : child.getAttribute("tab") || child.getAttribute("data-tab");
// if the tab text is not blank
if (tab !== null) { if (tab !== null) {
const tabID = tab.replace(/\W+/g, "-").toLowerCase(); const tabID = tab.replace(/\W+/g, "-").toLowerCase();
const tabPanel = document.createElement('div');
// define the tab panel content
let tabPanel = null;
if (dtls) {
tabPanel = child;
tabPanel.setAttribute("open", "");
} else {
tabPanel = document.createElement('div');
tabPanel.appendChild(child.cloneNode(true));
}
tabPanel.id = `tab-panel-${tabgroup}-${tabID}`; tabPanel.id = `tab-panel-${tabgroup}-${tabID}`;
tabPanel.className = tablist === "" ? "open" : ""; tabPanel.className = tablist === "" ? "open" : "";
tabPanel.setAttribute("role", "tabpanel"); tabPanel.setAttribute("role", "tabpanel");
tabPanel.setAttribute("tabindex", "0"); tabPanel.setAttribute("tabindex", "0");
tabPanel.setAttribute("aria-labelledby", `tab-${tabgroup}-${tabID}`); tabPanel.setAttribute("aria-labelledby", `tab-${tabgroup}-${tabID}`);
tabPanel.appendChild(child.cloneNode(true));
child.parentNode.replaceChild(tabPanel, child); child.parentNode.replaceChild(tabPanel, child);
tablist += `<li tabindex="0" role="tab" ${tablist === "" ? "class='selected'" : ""} id="tab-${tabgroup}-${tabID}"><span>${tab}</span></li>`; tablist += `<li tabindex="0" role="tab" id="tab-${tabgroup}-${tabID}"><span>${tab}</span></li>`;
} else { } else {
child.classList.add("tab-hidden"); child.classList.add("tab-hidden");
} }
@@ -234,31 +276,40 @@ export function init(container = document, spacer = true, args = {}) {
const ul = document.createElement('ul'); const ul = document.createElement('ul');
ul.setAttribute("role", "tablist"); ul.setAttribute("role", "tablist");
ul.innerHTML = spacer != true ? `${tablist}` : `${tablist}<li role="separator" class="separator"></li>`;
tabGroup.insertBefore(ul, tabGroup.firstChild); tabGroup.insertBefore(ul, tabGroup.firstChild);
ul.innerHTML = spacer != true ? `${tablist}` : `${tablist}<li role="separator" class="separator"></li>`;
tabGroup.querySelectorAll('[role="tab"]').forEach(tab => { if ( tabGroup.hasAttribute("order") || tabGroup.hasAttribute("data-order") ) {
tab.addEventListener("click", (e) => { let order = (tabGroup.getAttribute("order") || tabGroup.getAttribute("data-order")).split(",");
if (e.altKey && typeof args.altModifier == "function") {
args.altModifier(tab);
} else if (e.shiftKey && typeof args.shiftModifier == "function") {
args.shiftModifier(tab);
} else if (e.metaKey && typeof args.metaModifier == "function") {
args.metaModifier(tab);
} else {
const siblings = Array.from(tab.parentNode.children);
siblings.forEach(sibling => sibling.classList.remove("selected"));
tab.classList.add("selected");
const tabPanels = Array.from(tab.parentNode.parentNode.children) const items = Array.from(ul.getElementsByTagName("li"));
.filter(child => child.getAttribute("role") === "tabpanel"); items.sort((a, b) => {
tabPanels.forEach(panel => panel.classList.remove("open")); console.log("here")
const aa = order.indexOf(a.textContent.trim());
const bb = order.indexOf(b.textContent.trim());
const tabPanelId = tab.getAttribute("id").replace("tab", "tab-panel"); // Check if both items exist in orderArray
document.getElementById(tabPanelId).classList.add("open"); if (aa === -1) return 1; // Move to the end if not found
} if (bb === -1) return -1; // Move to the end if not found
return aa - bb; // Sort based on the defined order
}); });
ul.innerHTML = '';
items.forEach(item => ul.appendChild(item));
}
tabGroup.querySelectorAll('[role="tab"]').forEach(tab => {
tab.addEventListener("click", (evt) => {
if (pushState == 0) {
window.history.pushState({rand: Math.random(), pushState: pushState, tab: tab.parentNode.firstChild.getAttribute("id")}, "", `#${tab.parentNode.firstChild.getAttribute("id")}`);
pushState++;
}
chooseTab(evt.currentTarget);
window.history.pushState({rand: Math.random(), pushState: pushState, tab: tab.getAttribute("id")}, "", `#${tab.getAttribute("id")}`);
pushState++;
});
tab.addEventListener("keypress", (e) => { tab.addEventListener("keypress", (e) => {
e.preventDefault(); e.preventDefault();
@@ -267,14 +318,24 @@ export function init(container = document, spacer = true, args = {}) {
} }
}) })
}); });
ul.querySelector("li").classList.add("selected");
} }
if (document.location.hash != "" && document.location.hash.substring(0,5) == "#tab-") { if (document.location.hash != "" && document.location.hash.substring(0,5) == "#tab-") {
waitForElement(document.location.hash).then((el) => { waitForElement(document.location.hash).then((el) => {
el.scrollIntoView(); //el.scrollIntoView();
el.focus();
el.dispatchEvent(click); el.dispatchEvent(click);
}); });
}
});
window.addEventListener("popstate", function (e) {
e.preventDefault();
if (e.state != null) {
chooseTab(document.querySelector(`#${e.state.tab}`));
} else {
history.go(-1);
} }
}); });
} }

View File

@@ -2,6 +2,13 @@
<html> <html>
<head> <head>
<title>Pattern</title> <title>Pattern</title>
<script>
let u = document.location.href.substring(0, document.location.href.search(/patterns/i));
let p = document.location.pathname.substring(document.location.pathname.search(/patterns/i));
p = p.replace(/\/$|\/index\.html/i, "").substring(9);
window.location = u + "?p=" + p;
</script>
</head> </head>
<body data-prismjs-copy-timeout="1500"> <body data-prismjs-copy-timeout="1500">
<h2>What is it</h2> <h2>What is it</h2>
@@ -36,6 +43,7 @@
background: #fff; background: #fff;
border-radius: 0.5rem; border-radius: 0.5rem;
color: #000; color: #000;
display: none;
-webkit-filter: drop-shadow(0 3px 3px hsla(0, 0%, 0%, 0.15)) drop-shadow(0 12px 12px hsla(0, 0%, 0%, 0.15)); -webkit-filter: drop-shadow(0 3px 3px hsla(0, 0%, 0%, 0.15)) drop-shadow(0 12px 12px hsla(0, 0%, 0%, 0.15));
filter: drop-shadow(0 3px 3px hsla(0, 0%, 0%, 0.15)) drop-shadow(0 12px 12px hsla(0, 0%, 0%, 0.15)); filter: drop-shadow(0 3px 3px hsla(0, 0%, 0%, 0.15)) drop-shadow(0 12px 12px hsla(0, 0%, 0%, 0.15));
font-size: 1rem; font-size: 1rem;
@@ -162,6 +170,7 @@
position: relative; position: relative;
} }
:has(> [role=tooltip]):is(:hover, :focus-visible, :active) > [role=tooltip] { :has(> [role=tooltip]):is(:hover, :focus-visible, :active) > [role=tooltip] {
display: block;
opacity: 1; opacity: 1;
-webkit-transition-delay: 300ms; -webkit-transition-delay: 300ms;
transition-delay: 300ms; transition-delay: 300ms;
@@ -182,11 +191,13 @@
} }
}</pre> }</pre>
<div tab="scss"> <div tab="scss">
<pre class="language-sass">@import "scss/core/tooltip/_tooltip"; <h2>Example</h2>
<pre class="language-sass">@use "scss/core/tooltip/_tooltip";
@include tooltip;</pre> @include tooltip;</pre>
<pre class="language-sass">//- DS2 core (c) 2024 Alexander McIlwraith <pre class="language-sass">//- DS2 core (c) 2024 Alexander McIlwraith
//- Licensed under CC BY-SA 4.0 //- Licensed under CC BY-SA 4.0
$font-body: sans-serif !default;
$tooltip-border-radius: .5rem !default; $tooltip-border-radius: .5rem !default;
$tooltip-dark-allow: true !default; $tooltip-dark-allow: true !default;
$tooltip-dark-background: #1f2127 !default; $tooltip-dark-background: #1f2127 !default;
@@ -214,7 +225,9 @@ $tooltip-pointer-top: conic-gradient(from 150deg at top, rgba(0, 0, 0, 0), #000
background: $tooltip-light-background; background: $tooltip-light-background;
border-radius: $tooltip-border-radius; border-radius: $tooltip-border-radius;
color: $tooltip-light-foreground; color: $tooltip-light-foreground;
display: none;
filter: $tooltip-light-drop-shadow; filter: $tooltip-light-drop-shadow;
$font-family: $font-body;
font-size: 1rem; font-size: 1rem;
font-weight: 400; font-weight: 400;
inline-size: max-content; inline-size: max-content;
@@ -336,6 +349,7 @@ $tooltip-pointer-top: conic-gradient(from 150deg at top, rgba(0, 0, 0, 0), #000
:has(> [role="tooltip"]) { :has(> [role="tooltip"]) {
position: relative; position: relative;
&:is(:hover, :focus-visible, :active) > [role="tooltip"] { &:is(:hover, :focus-visible, :active) > [role="tooltip"] {
display: block;
opacity: 1; opacity: 1;
transition-delay: 300ms; transition-delay: 300ms;
} }

View File

@@ -1,7 +1,8 @@
- var site = "DS2 core" - var site = "DS2 core"
- var lang = "en-uk" - var lang = "en-uk"
- var colorpfx = "colour" - var colorpfx = "colour"
- var headings = ["What is it", "When to use it", "How to use it"] - var headings = ["What is it", "When to use it", "How to use it", "Example"]
- var downloadExtensions = ["js", "pug", "scss"]
- var generateColourToken = ["colours"] - var generateColourToken = ["colours"]
- -
@@ -49,7 +50,7 @@
core: true, core: true,
}, },
{ {
name: "breakpoints", name: "breakpoint",
status: "complete", status: "complete",
core: true, core: true,
}, },

View File

@@ -240,7 +240,7 @@ mixin colour-samples(colors, theid)
notes= colors[i].note notes= colors[i].note
- } - }
div.tab-group(id= theid ) tabset(id= theid order= taborder)
- csstab = csstab == undefined ? "css" : csstab - csstab = csstab == undefined ? "css" : csstab
- scsstab = scsstab == undefined ? "scss" : scsstab - scsstab = scsstab == undefined ? "scss" : scsstab

View File

@@ -1,3 +1,5 @@
@use "../pg/patterns/core/breakpoint/breakpoint";
@mixin core-colour-samples { @mixin core-colour-samples {
#copystatus { #copystatus {
@@ -36,14 +38,14 @@
gap: 1rem; gap: 1rem;
margin-bottom: 1rem; margin-bottom: 1rem;
@include break(-lg) { @include breakpoint.break(-lg) {
display: grid; display: grid;
grid-template-columns: repeat(2, 1fr); grid-template-columns: repeat(2, 1fr);
max-width: 100%; max-width: 100%;
width: 100%; width: 100%;
} }
@include break(-sm) { @include breakpoint.break(-sm) {
grid-template-columns: auto; grid-template-columns: auto;
width: 100%; width: 100%;
max-width: 100%; max-width: 100%;
@@ -67,7 +69,7 @@
width: 20rem; width: 20rem;
max-width: 318px; max-width: 318px;
@include break(-lg) { @include breakpoint.break(-lg) {
width: 100%; width: 100%;
max-width: 100%; max-width: 100%;
} }
@@ -102,7 +104,7 @@
display: grid; display: grid;
gap: .5rem; gap: .5rem;
grid-template-columns: repeat(3, 1fr); grid-template-columns: repeat(3, 1fr);
grid-template-rows: 2.5rem repeat(2, max-content); grid-template-rows: repeat(3, max-content);
.result { .result {
align-items: center; align-items: center;
border-radius: .5rem; border-radius: .5rem;

View File

@@ -73,6 +73,9 @@ html(lang= lang )
a.skip(href="#main") Skip to main content a.skip(href="#main") Skip to main content
block top
div.container div.container
block header block header
@@ -83,4 +86,8 @@ html(lang= lang )
each category in content each category in content
+show-content(category, "") +show-content(category, "")
block footer
block bottom
script(src="assets/scaffolding-min.js") script(src="assets/scaffolding-min.js")

View File

@@ -5,271 +5,18 @@
This file is generates _core.scss using information in ../pg/_config.pug. This file is generates _core.scss using information in ../pg/_config.pug.
Please make your changes in your _config.pug file so that they are not Please make your changes in your _config.pug file so that they are not
overwritten. \n*/\n\n\n` overwritten. \n*/\n\n\n`
| !{out}
include ../_config include ../_config
include _colour-samples include _colour-samples
include _core-colour-samples.scss
- out = `\n\n//colour tokens\n$${colorpfx}: (`
-
out +=`@mixin core-colour-samples {
#copystatus {
left: 50%;
position: absolute;
z-index: 100;
div {
border-radius: 1rem;
border: 1px solid green;
left: -50%;
padding: 1rem;
position: relative;
white-space: nowrap;
&::after {
clear: both;
content: " ";
display: block;
}
&.succeeded {
background-color: white;
border-color: black;
color: black;
}
&.failed {
background-color: white;
border-color: #f00;
color: #f00;
}
}
}
color-samples {
display: flex;
flex-direction: row;
flex-wrap: wrap;
gap: 1rem;
margin-bottom: 1rem;
@include break(-lg) {
display: grid;
grid-template-columns: repeat(2, 1fr);
max-width: 100%;
width: 100%;
}
@include break(-sm) {
grid-template-columns: auto;
width: 100%;
max-width: 100%;
}
color-sample {
align-items: center;
border-radius: .5rem;
border: 1px solid #CCC;
display: grid;
font-family: inherit;
gap: .5rem;
grid-template-areas: "name name name hex hex hex"
"name name name rgb rgb rgb"
"acc acc acc acc acc acc"
"lighter lighter lighter darker darker darker"
"notes notes notes notes notes notes";
grid-template-columns: repeat(6, 1fr);
grid-template-rows: repeat(2, 1.5rem) repeat(4, max-content); // 3rem repeat(2, 2rem) 1.5rem repeat(3, max-content);
padding: 1rem;
width: 20rem;
max-width: 318px;
@include break(-lg) {
width: 100%;
max-width: 100%;
}
name {
align-self: start;
font-size: 1.25rem;
grid-area: name;
span {
cursor: pointer;
}
}
rgb {
grid-area: rgb;
white-space: nowrap;
}
hex {
grid-area: hex;
white-space: nowrap;
}
> accessibility {
border-bottom: 1px solid #ccc;
border-top: 1px solid #ccc;
}
accessibility {
grid-area: acc;
grid-row: 3;
padding: .5rem 0;
display: grid;
gap: .5rem;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(3, max-content);
.result {
align-items: center;
border-radius: .5rem;
display: grid;
grid-template-columns: repeat(2, 1fr);
border: 1px solid #ccc;
padding: 0 1rem;
text-align: center;
&.accwaa, &.accwaaa {
background-color: white;
color: black;
}
&.accbaa, &.accbaaa {
background-color: black;
color: white;
}
span:nth-child(2) {
font-size: 2rem;
}
}
.aa, .aaa {
align-self: center;
display: block;
font-size: .75rem;
}
.acchb {
grid-column: 2;
}
.acchb, .acchw {
display: grid;
grid-tempate-columns: auto;
grid-template-rows: repeat(2, max-content);
align-self: start;
text-align: center;
padding: 0;
span {
grid-row: 1;
grid-column: 1 / -1;
font-size: .9rem;
}
small {
text-align: center;
grid-row: 2;
grid-column: 1 / -1;
font-size: .75rem;
}
}
}
sample-block {
align-self: start;
grid-column: span 3;
grid-row: 4;
color-pill {
display: grid;
grid-gap: .5rem;
grid-template-columns: 20px max-content auto;
:nth-child(1) {
align-self: center;
border-radius: 5px;
border: 1px solid #CCC;
display: inline-block;
height: 10px;
width: 20px;
}
span {
cursor: pointer;
.tooltip-tc {
padding: .5rem;
width: 20rem;
max-width: 318px;
height: max-contents;
display: grid;
gap: .5rem;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(3, max-content);
.result {
align-items: center;
border-radius: .5rem;
display: grid;
grid-template-columns: repeat(2, 1fr);
border: 1px solid #ccc;
padding: 0 1rem;
text-align: center;
&.accwaa, &.accwaaa {
background-color: white;
color: black;
}
&.accbaa, &.accbaaa {
background-color: black;
color: white;
}
span{ border: none;
&:nth-child(2) {
font-size: 2rem;
}
}
}
.aa, .aaa {
align-self: center;
display: block;
font-size: .75rem;
}
.acchb {
grid-column: 2;
}
.acchb, .acchw {
border: none;
display: block;
width: 100%;
place-self: stretch;
text-align: center;
span {
border: none;
font-size: .9rem;
width: 100%;
&::after, &::before {
display: none;
}
}
small {
font-size: .75rem;
text-align: center;
}
}
}
}
}
}
notes {
border-top: 1px solid #ccc;
grid-column: 1 / -1;
padding-top: .5rem;
}
}
}
}`
- out += `\n\n//colour tokens\n$${colorpfx}: (`
each val in generateColourToken each val in generateColourToken
- out += generateSCSS(eval(val), colorpfx) - out += generateSCSS(eval(val), colorpfx)
//- var scss = $colors //- var scss = $colors
| !{generateSCSS(eval(val), colorpfx)} | !{generateSCSS(eval(val), colorpfx)}

View File

@@ -1,3 +1,13 @@
include ../_config.pug
if typeof downloadExtensions == "undefined"
- var extensions = `["js", "scss", "hello"]`
else
- var extensions = []
each ext in downloadExtensions
- extensions.push("'" + ext + "'")
- extensions = "[" + extensions + "]"
- -
var php = `<?php var php = `<?php
function recursor($dir, $type) { function recursor($dir, $type) {
@@ -25,7 +35,7 @@
return $result; return $result;
} }
$allowed_types = ["scss", "js"]; $allowed_types = {{extensions}};
$patterns = dirname(dirname(__file__)) . "/src/pg/patterns"; $patterns = dirname(dirname(__file__)) . "/src/pg/patterns";
@@ -50,5 +60,7 @@
header('Content-type: application/zip'); header('Content-type: application/zip');
header(sprintf('Content-Disposition: attachment; filename="%s.zip"', $type)); header(sprintf('Content-Disposition: attachment; filename="%s.zip"', $type));
echo(file_get_contents($t)); ?>` echo(file_get_contents($t)); ?>`.replace("{{extensions}}", extensions)
| !{php} | !{php}

View File

@@ -1,10 +1,13 @@
//- DS2 core (c) 2024 Alexander McIlwraith //- DS2 core (c) 2024 Alexander McIlwraith
//- Licensed under CC BY-SA 4.0 //- Licensed under CC BY-SA 4.0
@use 'sass:map';
@use 'sass:string';
// default breakpoints match bootstrap 5 breakpoints. // default breakpoints match bootstrap 5 breakpoints.
$grid-breakpoints: ( xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px ) !default; $grid-breakpoints: ( xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 1400px ) !default;
@mixin breakpoint-debug { @mixin debug {
body::before, body::after { body::before, body::after {
background-color: #555; background-color: #555;
color: white; color: white;
@@ -38,30 +41,30 @@ $grid-breakpoints: ( xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px, xxl: 14
$min: 0; $min: 0;
$max: 0; $max: 0;
@if str-length($bp) == 2 { @if string.length($bp) == 2 {
// only a single break point was received // only a single break point was received
$min: map-get($points, $bp); $min: map.get($points, $bp);
$max: map-get($points, nth(map-keys($points), index(map-keys($points), $bp) + 1)); $max: map.get($points, nth(map.keys($points), index(map.keys($points), $bp) + 1));
} @else { } @else {
@if str-slice($bp, 0, 1) == "-" { @if string.slice($bp, 0, 1) == "-" {
// no lower breakpoint was received // no lower breakpoint was received
$min: null; $min: null;
$max: map-get($points, str-slice($bp, 2, 3)); $max: map.get($points, string.slice($bp, 2, 3));
} @else { } @else {
$min: map-get($points, unquote(str-slice($bp, 0, 2))); $min: map.get($points, string.unquote(string.slice($bp, 0, 2)));
@if str-length($bp) == 3 { @if string.length($bp) == 3 {
// no upper break point was received // no upper break point was received
$max: null; $max: null;
} @else { } @else {
$max: map-get($points, str-slice($bp, 4, 5)); $max: map.get($points, string.slice($bp, 4, 5));
} }
} }
} }

View File

@@ -17,14 +17,14 @@ block content
p When using this, use the default break points as they are set to the same as the Bootstrap framework. The grid for the design system at large break point has been widened to accompdate 3 colour cards across. p When using this, use the default break points as they are set to the same as the Bootstrap framework. The grid for the design system at large break point has been widened to accompdate 3 colour cards across.
tabset#breakpoints tabset#breakpoints(order= taborder)
div(tab="scss") div(tab="scss")
+h(3) +h(3)
pre.language-sass. pre.language-sass.
@import "scss/core/breakpoints/breakpoints"; @use "scss/core/breakpoint/breakpoint";
@include break([breakpoint]) { @include breapoint.break([breakpoint]) {
// css here // css here
} }
+h(4) +h(4)
pre.language-sass pre.language-sass
include _breakpoints.scss include _breakpoint.scss

View File

@@ -1 +1,53 @@
header{display:-ms-grid;display:grid;-ms-grid-rows:1.75rem 3.5rem;grid-template-rows:1.75rem 3.5rem;-ms-grid-column:2;-ms-grid-column-span:2;grid-column:2/4;overflow:hidden}header svg{grid-column:1/-1;grid-row:1/-1;-ms-grid-row-align:stretch;-ms-grid-column-align:stretch;place-self:stretch}header svg text{-webkit-transform:translate(-1rem,7.25rem);-ms-transform:translate(-1rem,7.25rem);transform:translate(-1rem,7.25rem);font-size:10rem;font-weight:1000;font-family:sans-serif;fill:var(--colour-grey-xxl)}header>div{-ms-grid-row:2;grid-row:2;grid-column:1/-1;display:-ms-grid;display:grid;grid-column-gap:1rem;-ms-grid-columns:auto -webkit-max-content -webkit-max-content;-ms-grid-columns:auto max-content max-content;grid-template-columns:auto -webkit-max-content -webkit-max-content;grid-template-columns:auto max-content max-content}header>div .header-title h1{margin:0;padding:0 1rem}header>div .header-title h1 a,header>div .header-title h1 a:visited{border-bottom:none;color:var(--colour-black);font-family:sans-serif;font-size:2.5rem;font-size:32px;font-weight:700;margin:0;padding:0;text-decoration:none} header {
display: -ms-grid;
display: grid;
-ms-grid-rows: 1.75rem 3.5rem;
grid-template-rows: 1.75rem 3.5rem;
-ms-grid-column: 2;
-ms-grid-column-span: 2;
grid-column: 2/4;
overflow: hidden;
}
header svg {
grid-column: 1/-1;
grid-row: 1/-1;
-ms-grid-row-align: stretch;
-ms-grid-column-align: stretch;
place-self: stretch;
}
header svg text {
-webkit-transform: translate(-1rem, 7.25rem);
-ms-transform: translate(-1rem, 7.25rem);
transform: translate(-1rem, 7.25rem);
font-size: 10rem;
font-weight: 1000;
font-family: sans-serif;
fill: var(--colour-grey-xxl);
}
header > div {
-ms-grid-row: 2;
grid-row: 2;
grid-column: 1/-1;
display: -ms-grid;
display: grid;
grid-column-gap: 1rem;
-ms-grid-columns: auto -webkit-max-content -webkit-max-content;
-ms-grid-columns: auto max-content max-content;
grid-template-columns: auto -webkit-max-content -webkit-max-content;
grid-template-columns: auto max-content max-content;
}
header > div .header-title h1 {
margin: 0;
padding: 0 1rem;
}
header > div .header-title h1 a, header > div .header-title h1 a:visited {
border-bottom: none;
color: var(--colour-black);
font-family: sans-serif;
font-size: 2.5rem;
font-size: 32px;
font-weight: 700;
margin: 0;
padding: 0;
text-decoration: none;
}

View File

@@ -5,5 +5,5 @@
// this file should not be minified // this file should not be minified
@import "_header.scss"; @use "_header.scss";
@include header; @include header.header;

View File

@@ -12,7 +12,7 @@ block content
+h(2) +h(2)
p Place the header at the top of the page after the skip to main content link. You will likely want to replace core header should be replaced with your own site's header. To do this, remove the #[code.inline.language-js core: true ] and create your own pattern in the location you wish it in your design system. p Place the header at the top of the page after the skip to main content link. You will likely want to replace core header should be replaced with your own site's header. To do this, remove the #[code.inline.language-js core: true ] and create your own pattern in the location you wish it in your design system.
tabset#header tabset#header(order= taborder)
pre.language-html(tab="html") pre.language-html(tab="html")
// create temp variables and store the design system values // create temp variables and store the design system values
- var tmpsite= site - var tmpsite= site
@@ -32,7 +32,7 @@ block content
div.language-sass(tab="scss") div.language-sass(tab="scss")
pre.language-sass. pre.language-sass.
@import "scss/core/header/header; @use "scss/core/header/header;
pre.language-sass pre.language-sass
include _header.scss include _header.scss

View File

@@ -6,13 +6,13 @@ block content
- -
- let list = [] - let list = []
- for(let i = 0; i < content.length; i++) { - for(let i = 0; i < content.length; i++) {
- list.push({ "name": content[i].name, "path": content[i].name, "status": content[i].status, "display": (content[i].hasOwnProperty("display") && content[i].display != "" ? content[i].display : content[i].name.toSentenceCase().toContent()) } ) - list.push({ "name": content[i].name, "core": (typeof content[i].core != 'undefined' && content[i].core ? 'true' : 'false'), "path": content[i].name, "status": content[i].status, "display": (content[i].hasOwnProperty("display") && content[i].display != "" ? content[i].display : content[i].name.toSentenceCase().toContent()) } )
- if (content[i].files != undefined) { - if (content[i].files != undefined) {
- for (let ii = 0; ii < content[i].files.length; ii++) { - for (let ii = 0; ii < content[i].files.length; ii++) {
- list.push({ "name": content[i].files[ii].name, "path": content[i].name +"."+ content[i].files[ii].name, "status": content[i].files[ii].status, "display": (content[i].files[ii].hasOwnProperty("display") && content[i].files[ii].display != "" ? content[i].files[ii].display : content[i].files[ii].name.toSentenceCase().toContent()) } ) - list.push({ "name": content[i].files[ii].name, "core": (typeof content[i].files[ii].core != 'undefined' && content[i].files[ii].core ? 'true' : 'false'), "path": content[i].name +"."+ content[i].files[ii].name, "status": content[i].files[ii].status, "display": (content[i].files[ii].hasOwnProperty("display") && content[i].files[ii].display != "" ? content[i].files[ii].display : content[i].files[ii].name.toSentenceCase().toContent()) } )
- if (content[i].files[ii].files != undefined) { - if (content[i].files[ii].files != undefined) {
- for (let iii = 0; iii < content[i].files[ii].files.length; iii++) { - for (let iii = 0; iii < content[i].files[ii].files.length; iii++) {
- list.push({ "name": content[i].files[ii].files[iii].name, "path": content[i].name +"."+ content[i].files[ii].name + "." + content[i].files[ii].files[iii].name, "status": content[i].files[ii].files[iii].status, "display": (content[i].files[ii].files[iii].hasOwnProperty("display") && content[i].files[ii].files[iii].display != "" ? content[i].files[ii].files[iii].display : content[i].files[ii].files[iii].name.toSentenceCase().toContent()) } ) - list.push({ "name": content[i].files[ii].files[iii].name, "core": (typeof content[i].files[ii].files[iii].core != 'undefined' && content[i].files[ii].files[iii].core ? 'true' : 'false'), "path": content[i].name +"."+ content[i].files[ii].name + "." + content[i].files[ii].files[iii].name, "status": content[i].files[ii].files[iii].status, "display": (content[i].files[ii].files[iii].hasOwnProperty("display") && content[i].files[ii].files[iii].display != "" ? content[i].files[ii].files[iii].display : content[i].files[ii].files[iii].name.toSentenceCase().toContent()) } )
- } - }
- } - }
- } - }
@@ -49,7 +49,7 @@ block content
- return count; - return count;
- } - }
div.tab-group#status-report tabset#status-report(order= taborder)
div.status-report.status-report-structure(data-tab="by&nbsp;structure") div.status-report.status-report-structure(data-tab="by&nbsp;structure")
table.custom(role="presentation") table.custom(role="presentation")
tbody tbody
@@ -64,7 +64,10 @@ block content
else else
| !{category.name.toContent().toSentenceCase()} | !{category.name.toContent().toSentenceCase()}
td td
span(class="status-" + category.status)= category.status.toContent().toSentenceCase() if typeof category.core && category.core
span.status-complete Complete (Core)
else
span(class="status-" + category.status)= category.status.toContent().toSentenceCase()
if category.files if category.files
@@ -77,7 +80,10 @@ block content
else else
| !{pattern.name.toContent().toSentenceCase()} | !{pattern.name.toContent().toSentenceCase()}
td td
span(class="status-" + pattern.status)= pattern.status.toContent().toSentenceCase() if typeof pattern.core && pattern.core
span.status-complete Complete (Core)
else
span(class="status-" + pattern.status)= pattern.status.toContent().toSentenceCase()
if pattern.files if pattern.files
@@ -90,14 +96,22 @@ block content
else else
| !{sub.name.toContent().toSentenceCase()} | !{sub.name.toContent().toSentenceCase()}
td td
span(class="status-" + sub.status)= sub.status.toContent().toSentenceCase() if typeof sub.core && sub.core
span.status-complete Complete (Core)
else
span(class="status-" + sub.status)= sub.status.toContent().toSentenceCase()
div.status-report.status-report-status(data-tab="by&nbsp;status") div.status-report.status-report-status(data-tab="by&nbsp;status")
table(role="presentation") table(role="presentation")
tbody tbody
- bystatus = list;
- for(i=0; i < bystatus.length; i++) {
- if (bystatus[i].core == "true") {
- bystatus[i].status = "complete"
- }
- }
each status in statuses || [] each status in statuses || []
- out = list.filter(list => list.status === status.name) - out = bystatus.filter(list => list.status === status.name)
tr tr
td(colspan="2") td(colspan="2")
span(class="status-" + status.name)= status.name.toContent().toSentenceCase() + " (" + out.length + ")" span(class="status-" + status.name)= status.name.toContent().toSentenceCase() + " (" + out.length + ")"
@@ -110,6 +124,9 @@ block content
| !{item.display} | !{item.display}
else else
| !{item.name.toContent().toSentenceCase()} | !{item.name.toContent().toSentenceCase()}
td
if item.core == "true"
span (core)
td= getCategory(item.path) td= getCategory(item.path)
div.status-report.status-report-alpha(data-tab="alphabetical") div.status-report.status-report-alpha(data-tab="alphabetical")
@@ -125,6 +142,9 @@ block content
| !{item.name.toContent().toSentenceCase()} | !{item.name.toContent().toSentenceCase()}
td td
span span
span(class="status-" + item.status)= item.status.toContent().toTitleCase() if item.core == "true"
span.status-complete Complete (Core)
else
span(class="status-" + item.status)= item.status.toContent().toTitleCase()
td= getCategory(item.path) td= getCategory(item.path)

View File

@@ -95,37 +95,39 @@ const calculateStickyPosition = (s) => {
} }
} }
export function init(p = document){ module.exports = {
font.size = parseFloat(getComputedStyle(document.documentElement).fontSize.replace("px","")); init: (p = document) => {
p.querySelectorAll("sticky-note").forEach((s) => {
if (s.querySelectorAll("svg").length == 0) {
let wrapper = document.createElement("sticky-note-wrapper");
s.parentNode.insertBefore(wrapper, s);
wrapper.appendChild(s);
s.setAttribute("content", s.innerHTML.replace(/"/g, "\""));
s.innerHTML = `<div><svg width='0' height='0'><defs><clipPath id='stickyClip' clipPathUnits='objectBoundingBox'><path d='M 0 0 Q 0 0.69, 0.03 0.96 0.03 0.96, 1 0.96 Q 0.96 0.69, 0.96 0 0.96 0, 0 0' stroke-linejoin='round' stroke-linecap='square' /></clipPath></defs></svg></div><div><div>${s.innerHTML}</div></div>`;
}
calculateStickyPosition(s);
drag(s);
s.ondblclick = (e) => {
if (e.ctrlKey) {
calculateStickyPosition(s);
} else {
// add one click select
}
}
})
window.onresize = () => {
font.size = parseFloat(getComputedStyle(document.documentElement).fontSize.replace("px","")); font.size = parseFloat(getComputedStyle(document.documentElement).fontSize.replace("px",""));
let stickies = p.querySelectorAll("sticky-note");
stickies.forEach((s) => { p.querySelectorAll("sticky-note").forEach((s) => {
if (s.querySelectorAll("svg").length == 0) {
let wrapper = document.createElement("sticky-note-wrapper");
s.parentNode.insertBefore(wrapper, s);
wrapper.appendChild(s);
s.setAttribute("content", s.innerHTML.replace(/"/g, "\""));
s.innerHTML = `<div><svg width='0' height='0'><defs><clipPath id='stickyClip' clipPathUnits='objectBoundingBox'><path d='M 0 0 Q 0 0.69, 0.03 0.96 0.03 0.96, 1 0.96 Q 0.96 0.69, 0.96 0 0.96 0, 0 0' stroke-linejoin='round' stroke-linecap='square' /></clipPath></defs></svg></div><div><div>${s.innerHTML}</div></div>`;
}
calculateStickyPosition(s); calculateStickyPosition(s);
}); drag(s);
s.ondblclick = (e) => {
if (e.ctrlKey) {
calculateStickyPosition(s);
} else {
// add one click select
}
}
})
window.onresize = () => {
font.size = parseFloat(getComputedStyle(document.documentElement).fontSize.replace("px",""));
let stickies = p.querySelectorAll("sticky-note");
stickies.forEach((s) => {
calculateStickyPosition(s);
});
}
} }
} }

View File

@@ -4,7 +4,7 @@
@use 'sass:color'; @use 'sass:color';
@use "sass:map"; @use "sass:map";
@use 'sass:list'; @use 'sass:list';
@import url('https://fonts.googleapis.com/css2?family=Kalam:wght@300;400;700&display=swap'); // @import url('https://fonts.googleapis.com/css2?family=Kalam:wght@300;400;700&display=swap');
$sticky-colors: ( $sticky-colors: (
"yellow": #ffffd3, "yellow": #ffffd3,
@@ -112,34 +112,52 @@ $sticky-colors: (
// default colour // default colour
> div:nth-child(2) { > div:nth-child(2) {
$sticky-color: nth(map.values($sticky-colors), 1); $sticky-color: list.nth(map.values($sticky-colors), 1);
// background: linear-gradient(
// 180deg,
// lighten($sticky-color, 2%) 0%,
// $sticky-color 2%,
// $sticky-color 12%,
// darken($sticky-color, 2%) 75%,
// darken($sticky-color, 5%) 100%
// );
background: linear-gradient( background: linear-gradient(
180deg, 180deg,
lighten($sticky-color, 2%) 0%, color.adjust($sticky-color, $lightness: 2%) 0%,
$sticky-color 2%, $sticky-color 2%,
$sticky-color 12%, $sticky-color 12%,
darken($sticky-color, 2%) 75%, color.adjust($sticky-color, $lightness: -2%) 75%,
darken($sticky-color, 5%) 100% color.adjust($sticky-color, $lightness: -5%) 100%
); );
} }
// all class colors // all class colors
@each $class, $sticky-color in $sticky-colors { @each $class, $sticky-color in $sticky-colors {
&.#{$class} > div:nth-child(2) { &.#{$class} > div:nth-child(2) {
@if $class != nth(map.keys($sticky-colors), 1) { @if $class != list.nth(map.keys($sticky-colors), 1) {
background: linear-gradient( background: linear-gradient(
180deg, 180deg,
lighten($sticky-color, 2%) 0%, color.adjust($sticky-color, $lightness: 2%) 0%,
$sticky-color 2%, $sticky-color 2%,
$sticky-color 12%, $sticky-color 12%,
darken($sticky-color, 2%) 75%, color.adjust($sticky-color, $lightness: -2%) 75%,
darken($sticky-color, 5%) 100% color.adjust($sticky-color, $lightness: -5%) 100%
); );
// background: linear-gradient(
// 180deg,
// lighten($sticky-color, 2%) 0%,
// $sticky-color 2%,
// $sticky-color 12%,
// darken($sticky-color, 2%) 75%,
// darken($sticky-color, 5%) 100%
// );
} }
} }
} }
} }
&:has(sticky-note:hover) { &:has(sticky-note:hover) {
background-color: #{nth(map.values($sticky-colors), 1)}; background-color: #{list.nth(map.values($sticky-colors), 1)};
border: 1px solid black; border: 1px solid black;
} }

View File

@@ -15,7 +15,7 @@ block content
p If you wish to create a custom element, that extends another HTML element, the native element has to be extended in customElements.define(). Custom elements that inherit native elements are also known as "type extension custom elements". p If you wish to create a custom element, that extends another HTML element, the native element has to be extended in customElements.define(). Custom elements that inherit native elements are also known as "type extension custom elements".
tabset#sticky-note tabset#sticky-note(order= taborder)
pre.language-html(tab="html") pre.language-html(tab="html")
include _sticky-note.pug include _sticky-note.pug
pre.language-pug(tab="pug") pre.language-pug(tab="pug")
@@ -26,7 +26,7 @@ block content
+h(3) +h(3)
pre.language-sass. pre.language-sass.
$sticky-colors: ( [sass map with your own defined colours] ); $sticky-colors: ( [sass map with your own defined colours] );
@import "scss/core/switch/_sticky-note"; @use "scss/core/switch/_sticky-note";
@include sticky-note; @include sticky-note;
+h(4) +h(4)

View File

@@ -1 +1,125 @@
@import url("https://fonts.googleapis.com/css2?family=Kalam:wght@300;400;700&display=swap");sticky-note-wrapper{-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid transparent;border-radius:50%;display:inline-block;height:0.5rem;position:relative;width:0.5rem}sticky-note-wrapper *{-webkit-box-sizing:border-box;box-sizing:border-box}sticky-note-wrapper sticky-note{cursor:-webkit-grab;cursor:grab;display:-ms-grid;display:grid;float:left;font-size:1rem;height:13rem;left:0;place-items:stretch;position:absolute;top:0;width:13rem;z-index:100}sticky-note-wrapper sticky-note:active{cursor:-webkit-grabbing;cursor:grabbing;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}sticky-note-wrapper sticky-note.right{float:right}sticky-note-wrapper sticky-note>div{-ms-grid-row:1;grid-row:1;-ms-grid-column:1;grid-column:1}sticky-note-wrapper sticky-note>div:first-child{background-color:rgba(0,0,0,0.25);-webkit-box-shadow:-2px 2px 15px 0 rgba(0,0,0,0.5);box-shadow:-2px 2px 15px 0 rgba(0,0,0,0.5);display:-ms-grid;display:grid;margin:2rem 1rem 0.25rem 0.36rem;width:calc(100% - 1rem)}sticky-note-wrapper sticky-note>div:nth-child(2){clip-path:url(#stickyClip);display:-ms-grid;display:grid;font-family:"Kalam",cursive;font-style:1rem;font-weight:300;line-height:1.25rem;padding:1rem;place-items:center;text-align:center}sticky-note-wrapper sticky-note>div:nth-child(2)>*{font-family:"Kalam",cursive!important;font-style:normal!important;font-weight:300!important}@media screen and (max-width:1024px){sticky-note-wrapper sticky-note>div:nth-child(2){max-width:13rem;min-width:13rem;width:1rem}}@media screen and (max-width:768px){sticky-note-wrapper sticky-note>div:nth-child(2){font-size:1.75rem;max-width:21rem;min-height:21rem}}@media screen and (max-width:640px){sticky-note-wrapper sticky-note>div:nth-child(2){font-size:2.5rem;max-width:26rem;min-height:26rem}}sticky-note-wrapper sticky-note>div:nth-child(2){background:-webkit-gradient(linear,left top,left bottom,from(#ffffdd),color-stop(2%,#ffffd3),color-stop(12%,#ffffd3),color-stop(75%,#ffffc9),to(#ffffba));background:linear-gradient(180deg,#ffffdd 0%,#ffffd3 2%,#ffffd3 12%,#ffffc9 75%,#ffffba 100%)}sticky-note-wrapper sticky-note.blue>div:nth-child(2){background:-webkit-gradient(linear,left top,left bottom,from(#9dddec),color-stop(2%,#94daea),color-stop(12%,#94daea),color-stop(75%,#8bd7e8),to(#7fd3e6));background:linear-gradient(180deg,#9dddec 0%,#94daea 2%,#94daea 12%,#8bd7e8 75%,#7fd3e6 100%)}sticky-note-wrapper sticky-note.pink>div:nth-child(2){background:-webkit-gradient(linear,left top,left bottom,from(#fa7c93),color-stop(2%,#fa728b),color-stop(12%,#fa728b),color-stop(75%,#fa6883),to(#f95977));background:linear-gradient(180deg,#fa7c93 0%,#fa728b 2%,#fa728b 12%,#fa6883 75%,#f95977 100%)}sticky-note-wrapper sticky-note.green>div:nth-child(2){background:-webkit-gradient(linear,left top,left bottom,from(#c5fcc9),color-stop(2%,#bbfbc0),color-stop(12%,#bbfbc0),color-stop(75%,#b1fab7),to(#a3faaa));background:linear-gradient(180deg,#c5fcc9 0%,#bbfbc0 2%,#bbfbc0 12%,#b1fab7 75%,#a3faaa 100%)}sticky-note-wrapper:has(sticky-note:hover){background-color:#ffffd3;border:1px solid black}sticky-note-wrapper:has(sticky-note.yellow:hover){background-color:#ffffd3}sticky-note-wrapper:has(sticky-note.blue:hover){background-color:#94daea}sticky-note-wrapper:has(sticky-note.pink:hover){background-color:#fa728b}sticky-note-wrapper:has(sticky-note.green:hover){background-color:#bbfbc0} sticky-note-wrapper {
-webkit-box-sizing: border-box;
box-sizing: border-box;
border: 1px solid transparent;
border-radius: 50%;
display: inline-block;
height: 0.5rem;
position: relative;
width: 0.5rem;
}
sticky-note-wrapper * {
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
sticky-note-wrapper sticky-note {
cursor: -webkit-grab;
cursor: grab;
display: -ms-grid;
display: grid;
float: left;
font-size: 1rem;
height: 13rem;
left: 0;
place-items: stretch;
position: absolute;
top: 0;
width: 13rem;
z-index: 100;
}
sticky-note-wrapper sticky-note:active {
cursor: -webkit-grabbing;
cursor: grabbing;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
sticky-note-wrapper sticky-note.right {
float: right;
}
sticky-note-wrapper sticky-note > div {
-ms-grid-row: 1;
grid-row: 1;
-ms-grid-column: 1;
grid-column: 1;
}
sticky-note-wrapper sticky-note > div:nth-child(1) {
background-color: rgba(0, 0, 0, 0.25);
-webkit-box-shadow: -2px 2px 15px 0 rgba(0, 0, 0, 0.5);
box-shadow: -2px 2px 15px 0 rgba(0, 0, 0, 0.5);
display: -ms-grid;
display: grid;
margin: 2rem 1rem 0.25rem 0.36rem;
width: calc(100% - 1rem);
}
sticky-note-wrapper sticky-note > div:nth-child(2) {
clip-path: url(#stickyClip);
display: -ms-grid;
display: grid;
font-family: "Kalam", cursive;
font-style: 1rem;
font-weight: 300;
line-height: 1.25rem;
padding: 1rem;
place-items: center;
text-align: center;
}
sticky-note-wrapper sticky-note > div:nth-child(2) > * {
font-family: "Kalam", cursive !important;
font-style: normal !important;
font-weight: 300 !important;
}
@media screen and (max-width: 1024px) {
sticky-note-wrapper sticky-note > div:nth-child(2) {
max-width: 13rem;
min-width: 13rem;
width: 1rem;
}
}
@media screen and (max-width: 768px) {
sticky-note-wrapper sticky-note > div:nth-child(2) {
font-size: 1.75rem;
max-width: 21rem;
min-height: 21rem;
}
}
@media screen and (max-width: 640px) {
sticky-note-wrapper sticky-note > div:nth-child(2) {
font-size: 2.5rem;
max-width: 26rem;
min-height: 26rem;
}
}
sticky-note-wrapper sticky-note > div:nth-child(2) {
background: -webkit-gradient(linear, left top, left bottom, from(rgb(255, 255, 221.2)), color-stop(2%, #ffffd3), color-stop(12%, #ffffd3), color-stop(75%, rgb(255, 255, 200.8)), to(rgb(255, 255, 185.5)));
background: linear-gradient(180deg, rgb(255, 255, 221.2) 0%, #ffffd3 2%, #ffffd3 12%, rgb(255, 255, 200.8) 75%, rgb(255, 255, 185.5) 100%);
}
sticky-note-wrapper sticky-note.blue > div:nth-child(2) {
background: -webkit-gradient(linear, left top, left bottom, from(rgb(156.5265625, 220.9484375, 235.6734375)), color-stop(2%, #94daea), color-stop(12%, #94daea), color-stop(75%, rgb(139.4734375, 215.0515625, 232.3265625)), to(rgb(126.68359375, 210.62890625, 229.81640625)));
background: linear-gradient(180deg, rgb(156.5265625, 220.9484375, 235.6734375) 0%, #94daea 2%, #94daea 12%, rgb(139.4734375, 215.0515625, 232.3265625) 75%, rgb(126.68359375, 210.62890625, 229.81640625) 100%);
}
sticky-note-wrapper sticky-note.pink > div:nth-child(2) {
background: -webkit-gradient(linear, left top, left bottom, from(rgb(250.3493150685, 123.8506849315, 147.104109589)), color-stop(2%, #fa728b), color-stop(12%, #fa728b), color-stop(75%, rgb(249.6506849315, 104.1493150685, 130.895890411)), to(rgb(249.1267123288, 89.3732876712, 118.7397260274)));
background: linear-gradient(180deg, rgb(250.3493150685, 123.8506849315, 147.104109589) 0%, #fa728b 2%, #fa728b 12%, rgb(249.6506849315, 104.1493150685, 130.895890411) 75%, rgb(249.1267123288, 89.3732876712, 118.7397260274) 100%);
}
sticky-note-wrapper sticky-note.green > div:nth-child(2) {
background: -webkit-gradient(linear, left top, left bottom, from(rgb(196.6333333333, 251.5666666667, 200.925)), color-stop(2%, #bbfbc0), color-stop(12%, #bbfbc0), color-stop(75%, rgb(177.3666666667, 250.4333333333, 183.075)), to(rgb(162.9166666667, 249.5833333333, 169.6875)));
background: linear-gradient(180deg, rgb(196.6333333333, 251.5666666667, 200.925) 0%, #bbfbc0 2%, #bbfbc0 12%, rgb(177.3666666667, 250.4333333333, 183.075) 75%, rgb(162.9166666667, 249.5833333333, 169.6875) 100%);
}
sticky-note-wrapper:has(sticky-note:hover) {
background-color: #ffffd3;
border: 1px solid black;
}
sticky-note-wrapper:has(sticky-note.yellow:hover) {
background-color: #ffffd3;
}
sticky-note-wrapper:has(sticky-note.blue:hover) {
background-color: #94daea;
}
sticky-note-wrapper:has(sticky-note.pink:hover) {
background-color: #fa728b;
}
sticky-note-wrapper:has(sticky-note.green:hover) {
background-color: #bbfbc0;
}

View File

@@ -1,5 +1,5 @@
//- DS2 core (c) 2024 Alexander McIlwraith //- DS2 core (c) 2024 Alexander McIlwraith
//- Licensed under CC BY-SA 4.0 //- Licensed under CC BY-SA 4.0
@import "_sticky-note"; @use "_sticky-note";
@include sticky-note; @include sticky-note.sticky-note;

View File

@@ -20,7 +20,7 @@ block content
label(for="example-switch") Switch label (states the on state) label(for="example-switch") Switch label (states the on state)
span#example-switch(role="switch") span#example-switch(role="switch")
div#switches.tab-group tabset#switches(order= taborder)
pre.language-html(tab="html") pre.language-html(tab="html")
include _switch.pug include _switch.pug
pre.language-pug(tab="pug") pre.language-pug(tab="pug")
@@ -30,7 +30,7 @@ block content
div(tab="scss") div(tab="scss")
+h(3) +h(3)
pre.language-sass. pre.language-sass.
@import "scss/core/switch/_switch"; @use "scss/core/switch/_switch";
@include switch; @include switch;
+h(4) +h(4)

View File

@@ -1 +1,26 @@
[role=switch]{display:-ms-inline-grid;display:inline-grid;border:1px solid #2e51a1;background-color:#d8d8d8;border-radius:0.75rem;height:1.5rem;width:3rem;-webkit-transition:all 500ms;transition:all 500ms}[role=switch]>span{display:inline-block;background-color:white;border-radius:50%;margin:2%;width:calc(1.5rem - 2%);-webkit-transition:all 500ms;transition:all 500ms}[role=switch][aria-checked=true]{background-color:#2e51a1}[role=switch][aria-checked=true]>span{margin-left:calc(1.5rem - 5%)} [role=switch] {
display: -ms-inline-grid;
display: inline-grid;
border: 1px solid #2e51a1;
background-color: #d8d8d8;
border-radius: 0.75rem;
height: 1.5rem;
width: 3rem;
-webkit-transition: all 500ms;
transition: all 500ms;
}
[role=switch] > span {
display: inline-block;
background-color: white;
border-radius: 50%;
margin: 2%;
width: calc(1.5rem - 2%);
-webkit-transition: all 500ms;
transition: all 500ms;
}
[role=switch][aria-checked=true] {
background-color: #2e51a1;
}
[role=switch][aria-checked=true] > span {
margin-left: calc(1.5rem - 5%);
}

View File

@@ -1,2 +1,2 @@
@import "_switch.scss"; @use "_switch.scss";
@include switch; @include switch.switch;

View File

@@ -1,6 +1,6 @@
/* DS2 core (c) 2024 Alexander McIlwraith /* DS2 core (c) 2024-2026 Alexander McIlwraith
Released under Creative Commons Attribution-ShareAlike 4.0 International Released under Creative Commons Attribution-ShareAlike 4.0 International
*/ */
// create a pure JS mouse click event // create a pure JS mouse click event
const click = new MouseEvent('click', { const click = new MouseEvent('click', {
@@ -9,97 +9,184 @@ const click = new MouseEvent('click', {
cancelable: true cancelable: true
}); });
// wait for an element to appear in the DOM
const waitForElement = (selector) => { const waitForElement = (selector) => {
return new Promise(resolve => { return new Promise(resolve => {
if (document.querySelector(selector)) { if (document.querySelector(selector)) {
return resolve(document.querySelector(selector)); return resolve(document.querySelector(selector));
} }
const observer = new MutationObserver(() => {
if (document.querySelector(selector)) {
observer.disconnect();
resolve(document.querySelector(selector));
}
});
observer.observe(document.body, {
childList: true,
subtree: true
});
});
};
const observer = new MutationObserver(mutations => { // Tab logic
if (document.querySelector(selector)) { const tabNamespace = "#tab:";
observer.disconnect();
resolve(document.querySelector(selector));
}
});
// If you get "parameter 1 is not of type 'Node'" error, see https://stackoverflow.com/a/77855838/492336 const chooseTab = (tab) => {
observer.observe(document.body, { const siblings = Array.from(tab.parentNode.children);
childList: true, siblings.forEach(sibling => sibling.classList.remove("selected"));
subtree: true tab.classList.add("selected");
});
});
}
const tabPanels = Array.from(tab.parentNode.parentNode.children);
tabPanels.forEach(panel => panel.classList.remove("open"));
export function init(container = document, spacer = true, args = {}) { const tabPanelId = tab
.getAttribute("id")
.replace("tab", "tab-panel");
document
.getElementById(tabPanelId)
.classList.add("open");
};
let pushStateCount = 0;
let tabsetCount = 0;
export function init(container = document, spacer = true) {
container.querySelectorAll(".tab-group, tabset").forEach(tabGroup => { container.querySelectorAll(".tab-group, tabset").forEach(tabGroup => {
if (tabGroup.querySelector("[role=tablist]") === null) { if (tabGroup.querySelector('[role="tablist"]') === null) {
if (tabGroup.getAttribute("id") == null) {
tabGroup.setAttribute("id", `tab-group-${tabsetCount++}`);
}
const tabgroup = tabGroup.getAttribute("id"); const tabgroup = tabGroup.getAttribute("id");
let tablist = ""; let tablist = "";
Array.from(tabGroup.children).forEach(child => { Array.from(tabGroup.children).forEach(child => {
const tab = child.getAttribute("tab") || child.getAttribute("data-tab");
if (tab !== null) { const isDetails = child.nodeName === "DETAILS";
const tabID = tab.replace(/\W+/g, "-").toLowerCase(); const tabLabel =
const tabPanel = document.createElement('div'); isDetails
? child.querySelector("summary")?.innerHTML
: child.getAttribute("tab") || child.getAttribute("data-tab");
if (tabLabel !== null) {
const tabID = tabLabel.replace(/\W+/g, "-").toLowerCase();
let tabPanel;
if (isDetails) {
tabPanel = child;
tabPanel.setAttribute("open", "");
} else {
tabPanel = document.createElement("div");
tabPanel.appendChild(child.cloneNode(true));
}
tabPanel.id = `tab-panel-${tabgroup}-${tabID}`; tabPanel.id = `tab-panel-${tabgroup}-${tabID}`;
tabPanel.className = tablist === "" ? "open" : ""; tabPanel.className = tablist === "" ? "open" : "";
tabPanel.setAttribute("role", "tabpanel"); tabPanel.setAttribute("role", "tabpanel");
tabPanel.setAttribute("tabindex", "0"); tabPanel.setAttribute("tabindex", "0");
tabPanel.setAttribute("aria-labelledby", `tab-${tabgroup}-${tabID}`); tabPanel.setAttribute(
tabPanel.appendChild(child.cloneNode(true)); "aria-labelledby",
`tab-${tabgroup}-${tabID}`
);
child.parentNode.replaceChild(tabPanel, child); child.parentNode.replaceChild(tabPanel, child);
tablist += `<li tabindex="0" role="tab" ${tablist === "" ? "class='selected'" : ""} id="tab-${tabgroup}-${tabID}"><span>${tab}</span></li>`;
tablist += `
<li
tabindex="0"
role="tab"
id="tab-${tabgroup}-${tabID}"
>
<span>${tabLabel}</span>
</li>
`;
} else { } else {
child.classList.add("tab-hidden"); child.classList.add("tab-hidden");
} }
}); });
const ul = document.createElement('ul'); const ul = document.createElement("ul");
ul.setAttribute("role", "tablist"); ul.setAttribute("role", "tablist");
ul.innerHTML = spacer != true ? `${tablist}` : `${tablist}<li role="separator" class="separator"></li>`;
tabGroup.insertBefore(ul, tabGroup.firstChild); tabGroup.insertBefore(ul, tabGroup.firstChild);
tabGroup.querySelectorAll('[role="tab"]').forEach(tab => { ul.innerHTML = spacer !== true
tab.addEventListener("click", (e) => { ? tablist
if (e.altKey && typeof args.altModifier == "function") { : `${tablist}<li role="separator" class="separator"></li>`;
args.altModifier(tab);
} else if (e.shiftKey && typeof args.shiftModifier == "function") {
args.shiftModifier(tab);
} else if (e.metaKey && typeof args.metaModifier == "function") {
args.metaModifier(tab);
} else {
const siblings = Array.from(tab.parentNode.children);
siblings.forEach(sibling => sibling.classList.remove("selected"));
tab.classList.add("selected");
const tabPanels = Array.from(tab.parentNode.parentNode.children) // Tab ordering
.filter(child => child.getAttribute("role") === "tabpanel"); if (tabGroup.hasAttribute("order") || tabGroup.hasAttribute("data-order")) {
tabPanels.forEach(panel => panel.classList.remove("open"));
const tabPanelId = tab.getAttribute("id").replace("tab", "tab-panel"); const order = (
document.getElementById(tabPanelId).classList.add("open"); tabGroup.getAttribute("order") ||
} tabGroup.getAttribute("data-order")
).split(",");
const items = Array.from(ul.getElementsByTagName("li"));
items.sort((a, b) => {
const aa = order.indexOf(a.textContent.trim());
const bb = order.indexOf(b.textContent.trim());
if (aa === -1) return 1;
if (bb === -1) return -1;
return aa - bb;
}); });
ul.innerHTML = "";
items.forEach(item => ul.appendChild(item));
chooseTab(items[0]);
}
// Tab event handlers
tabGroup.querySelectorAll('[role="tab"]').forEach(tab => {
tab.addEventListener("click", (evt) => {
const tabId = tab.getAttribute("id");
const hash = `${tabNamespace}${tabId}`;
chooseTab(evt.currentTarget);
window.history.pushState(
{ tab: tabId },
"",
`${location.pathname}${location.search}${hash}`
);
pushStateCount++;
});
tab.addEventListener("keypress", (e) => { tab.addEventListener("keypress", (e) => {
e.preventDefault(); if (e.which === 32 || e.which === 13) {
if( e.which == 32 || e.which == 13 ) { e.preventDefault();
e.currentTarget.dispatchEvent(click); e.currentTarget.dispatchEvent(click);
} }
}) });
}); });
ul.querySelector("li")?.classList.add("selected");
} }
});
if (document.location.hash != "" && document.location.hash.substring(0,5) == "#tab-") { // Initial hash handling (tabs only)
waitForElement(document.location.hash).then((el) => { if (location.hash.startsWith(tabNamespace)) {
el.scrollIntoView(); const tabId = location.hash.replace(tabNamespace, "");
el.dispatchEvent(click); waitForElement(`#${tabId}`).then(el => {
}); el.focus();
el.dispatchEvent(click);
});
}
// History navigation (tabs only)
window.addEventListener("popstate", (e) => {
if (!location.hash.startsWith(tabNamespace)) return;
if (e.state?.tab) {
const tab = document.querySelector(`#${e.state.tab}`);
if (tab) chooseTab(tab);
} }
}); });
} }

View File

@@ -1,4 +1,4 @@
tabset#uniqueID tabset#uniqueID(order="tab title 2,tab title 1")
div(tab="[tab title]") div(tab="[tab title 1]")
div(tab="[tab title]") div(tab="[tab title 2]")

View File

@@ -1,4 +1,4 @@
tabset#uniqueID tabset#uniqueID(order="tab title 2,tab title 1")
div(tab="[tab title]") div(tab="[tab title 1]")
div(tab="[tab title]") div(tab="[tab title 2]")

View File

@@ -2,23 +2,59 @@
// Licensed under CC BY-SA 4.0 // Licensed under CC BY-SA 4.0
$tab-border: #7f7f7f !default; $tab-border: #7f7f7f !default;
$tab-panel-background-color: #FFF !default;
$tab-panel-top-border: #7f7f7f !default;
$tab-panel-top-border-width: 1px !default;
$tab-selected: #FFF !default; $tab-selected: #FFF !default;
$tab-selected-text: #000 !default;
$tab-notselected: #f0f0f0 !default; $tab-notselected: #f0f0f0 !default;
$tab-notselected-text: #000 !default;
@mixin tabs { @mixin tabs {
tabset, .tab-group { tabset, .tab-group {
margin: 2rem 0 1rem 0; margin: 2rem 0 1rem 0;
> ul {
[role="tablist"] {
display: flex; display: flex;
margin: 0; margin: 0;
padding: 0; padding: 0;
li.separator {
border-bottom: 1px solid $tab-border; li {
border-left: 1px solid $tab-border; &.separator {
display: inline-block; border-bottom: 1px solid $tab-border;
margin: .45rem 0 0 0; display: inline-block;
width: 100%; margin: .45rem 0 0 0;
width: 100%;
}
&[role="tab"] {
background-color: $tab-selected;
border-left: 1px solid $tab-border;
border-right: 1px solid $tab-border;
border-radius: .5rem .5rem 0 0;
border-top: 1px solid $tab-border;
cursor:pointer;
display: inline;
margin: 0;
padding: 1rem 1.5rem .14rem 1.5rem;
z-index: 2;
&:last-of-type {
border-right: 1px solid $tab-border;
}
&:not(.selected) {
background-color: $tab-notselected;
border-bottom: 1px solid $tab-border;
/// color
}
span {
display: block;
margin: 0 0 .5rem 0;
}
}
} }
} }
@@ -26,32 +62,6 @@ $tab-notselected: #f0f0f0 !default;
display: none; display: none;
} }
[role="tab"] {
background-color: $tab-selected;
border-left: 1px solid $tab-border;
border-top: 1px solid $tab-border;
border-radius: .5rem .5rem 0 0;
cursor:pointer;
margin: 0;
display: inline;
padding: 1rem 1.5rem .14rem 1.5rem;
z-index: 2;
&:last-of-type {
border-right: 1px solid $tab-border;
}
&:not(.selected) {
background-color: $tab-notselected;
border-bottom: 1px solid $tab-border;
}
span {
display: block;
margin: 0 0 .5rem 0;
}
}
[role="tabpanel"] { [role="tabpanel"] {
background-color: $tab-selected; background-color: $tab-selected;
border: 1px solid $tab-border; border: 1px solid $tab-border;
@@ -62,8 +72,7 @@ $tab-notselected: #f0f0f0 !default;
&:not(.open) { &:not(.open) {
display: none; display: none;
} }
@content;
} }
@content;
} }
} }

View File

@@ -20,19 +20,15 @@ block content
+h(2) +h(2)
p The structure of the tab set is defined in html. There are two forms supported. Adding a class of #[code.inline .tab-group] to the container element will work in place of the #[code.inline tabset] tag, and the tab panels can be defined using either #[code.inline tab=""] or #[code.inline data-tab=""]. Passing an optional element to the init function will initialise tabs within that element. p The structure of the tab set is defined in html. There are two forms supported. Adding a class of #[code.inline .tab-group] to the container element will work in place of the #[code.inline tabset] tag, and the tab panels can be defined using either #[code.inline tab=""] or #[code.inline data-tab=""]. Passing an optional element to the init function will initialise tabs within that element. Adding a #[code.inline order=""] or #[code.inline data-order=""] element to the tabset you can have the tabs sorted in a consistent order across tabsets.
p The tab initalize function now takes a new function parameter in the form of an third argument is an object that can take the following callbacks: +h(3)
ul pre.language-pug(tab="pug").
li altModifer (When the altKey is used) tabset(order="tab2, tab1")
li shiftModifier (When the shift key is used) div(tab="tab1")
li metaModifier (When the Windows key or Apple key is used) div(tab="tab2")
p You can use these callbacks to create a custom event to get the tab information.
p Note: There is a new core function (core.getTabPath) that will generate the query string and url hash for use in DS2 Core. You may wish to update your scaffolding.js file to make use of this functionality. tabset#tabs(order= taborder)
tabset#tabs
pre.language-html(tab="html") pre.language-html(tab="html")
include _tabs.pug include _tabs.pug
pre.language-pug(tab="pug") pre.language-pug(tab="pug")
@@ -42,7 +38,7 @@ block content
div(tab="scss") div(tab="scss")
+h(3) +h(3)
pre.language-sass. pre.language-sass.
@import "scss/core/tabs/_tabs"; @use "scss/core/tabs/_tabs";
@include tabs{ @include tabs{
// optional content block // optional content block
}; };

View File

@@ -1,45 +1,45 @@
tabset, .tab-group { tabset, .tab-group {
margin: 2rem 0 1rem 0; margin: 2rem 0 1rem 0;
} }
tabset > ul, .tab-group > ul { tabset [role=tablist], .tab-group [role=tablist] {
display: -webkit-box; display: -webkit-box;
display: -ms-flexbox; display: -ms-flexbox;
display: flex; display: flex;
margin: 0; margin: 0;
padding: 0; padding: 0;
} }
tabset > ul li.separator, .tab-group > ul li.separator { tabset [role=tablist] li.separator, .tab-group [role=tablist] li.separator {
border-bottom: 1px solid #7f7f7f; border-bottom: 1px solid #7f7f7f;
border-left: 1px solid #7f7f7f;
display: inline-block; display: inline-block;
margin: 0.45rem 0 0 0; margin: 0.45rem 0 0 0;
width: 100%; width: 100%;
} }
tabset .tab-hidden, .tab-group .tab-hidden { tabset [role=tablist] li[role=tab], .tab-group [role=tablist] li[role=tab] {
display: none;
}
tabset [role=tab], .tab-group [role=tab] {
background-color: #FFF; background-color: #FFF;
border-left: 1px solid #7f7f7f; border-left: 1px solid #7f7f7f;
border-top: 1px solid #7f7f7f; border-right: 1px solid #7f7f7f;
border-radius: 0.5rem 0.5rem 0 0; border-radius: 0.5rem 0.5rem 0 0;
border-top: 1px solid #7f7f7f;
cursor: pointer; cursor: pointer;
margin: 0;
display: inline; display: inline;
margin: 0;
padding: 1rem 1.5rem 0.14rem 1.5rem; padding: 1rem 1.5rem 0.14rem 1.5rem;
z-index: 2; z-index: 2;
} }
tabset [role=tab]:last-of-type, .tab-group [role=tab]:last-of-type { tabset [role=tablist] li[role=tab]:last-of-type, .tab-group [role=tablist] li[role=tab]:last-of-type {
border-right: 1px solid #7f7f7f; border-right: 1px solid #7f7f7f;
} }
tabset [role=tab]:not(.selected), .tab-group [role=tab]:not(.selected) { tabset [role=tablist] li[role=tab]:not(.selected), .tab-group [role=tablist] li[role=tab]:not(.selected) {
background-color: #f0f0f0; background-color: #f0f0f0;
border-bottom: 1px solid #7f7f7f; border-bottom: 1px solid #7f7f7f;
} }
tabset [role=tab] span, .tab-group [role=tab] span { tabset [role=tablist] li[role=tab] span, .tab-group [role=tablist] li[role=tab] span {
display: block; display: block;
margin: 0 0 0.5rem 0; margin: 0 0 0.5rem 0;
} }
tabset .tab-hidden, .tab-group .tab-hidden {
display: none;
}
tabset [role=tabpanel], .tab-group [role=tabpanel] { tabset [role=tabpanel], .tab-group [role=tabpanel] {
background-color: #FFF; background-color: #FFF;
border: 1px solid #7f7f7f; border: 1px solid #7f7f7f;

View File

@@ -1,5 +1,5 @@
//- DS2 core (c) 2024 Alexander McIlwraith //- DS2 core (c) 2024 Alexander McIlwraith
//- Licensed under CC BY-SA 4.0 //- Licensed under CC BY-SA 4.0
@import "_tabs.scss"; @use "_tabs.scss";
@include tabs; @include tabs.tabs;

View File

@@ -29,6 +29,7 @@ $tooltip-pointer-top: conic-gradient(from 150deg at top, rgba(0, 0, 0, 0), #000
background: $tooltip-light-background; background: $tooltip-light-background;
border-radius: $tooltip-border-radius; border-radius: $tooltip-border-radius;
color: $tooltip-light-foreground; color: $tooltip-light-foreground;
display: none;
filter: $tooltip-light-drop-shadow; filter: $tooltip-light-drop-shadow;
$font-family: $font-body; $font-family: $font-body;
font-size: 1rem; font-size: 1rem;
@@ -152,6 +153,7 @@ $tooltip-pointer-top: conic-gradient(from 150deg at top, rgba(0, 0, 0, 0), #000
:has(> [role="tooltip"]) { :has(> [role="tooltip"]) {
position: relative; position: relative;
&:is(:hover, :focus-visible, :active) > [role="tooltip"] { &:is(:hover, :focus-visible, :active) > [role="tooltip"] {
display: block;
opacity: 1; opacity: 1;
transition-delay: 300ms; transition-delay: 300ms;
} }

View File

@@ -33,7 +33,7 @@ block content
include _tooltip.pug include _tooltip.pug
tabset#tooltip tabset#tooltip(order= taborder)
pre.language-html(tab="html") pre.language-html(tab="html")
include _tooltip.pug include _tooltip.pug
pre.language-pug(tab="pug") pre.language-pug(tab="pug")
@@ -43,7 +43,7 @@ block content
div(tab="scss") div(tab="scss")
+h(3) +h(3)
pre.language-sass. pre.language-sass.
@import "scss/core/tooltip/_tooltip"; @use "scss/core/tooltip/_tooltip";
@include tooltip; @include tooltip;
+h(4) +h(4)
pre.language-sass pre.language-sass

View File

@@ -8,6 +8,7 @@
background: #fff; background: #fff;
border-radius: 0.5rem; border-radius: 0.5rem;
color: #000; color: #000;
display: none;
-webkit-filter: drop-shadow(0 3px 3px hsla(0, 0%, 0%, 0.15)) drop-shadow(0 12px 12px hsla(0, 0%, 0%, 0.15)); -webkit-filter: drop-shadow(0 3px 3px hsla(0, 0%, 0%, 0.15)) drop-shadow(0 12px 12px hsla(0, 0%, 0%, 0.15));
filter: drop-shadow(0 3px 3px hsla(0, 0%, 0%, 0.15)) drop-shadow(0 12px 12px hsla(0, 0%, 0%, 0.15)); filter: drop-shadow(0 3px 3px hsla(0, 0%, 0%, 0.15)) drop-shadow(0 12px 12px hsla(0, 0%, 0%, 0.15));
font-size: 1rem; font-size: 1rem;
@@ -134,6 +135,7 @@
position: relative; position: relative;
} }
:has(> [role=tooltip]):is(:hover, :focus-visible, :active) > [role=tooltip] { :has(> [role=tooltip]):is(:hover, :focus-visible, :active) > [role=tooltip] {
display: block;
opacity: 1; opacity: 1;
-webkit-transition-delay: 300ms; -webkit-transition-delay: 300ms;
transition-delay: 300ms; transition-delay: 300ms;

View File

@@ -1,5 +1,5 @@
//- DS2 core (c) 2024 Alexander McIlwraith //- DS2 core (c) 2024 Alexander McIlwraith
//- Licensed under CC BY-SA 4.0 //- Licensed under CC BY-SA 4.0
@import "_tooltip.scss"; @use "_tooltip.scss";
@include tooltip; @include tooltip.tooltip;

View File

@@ -10,6 +10,8 @@
*/ */
@use "../pg/patterns/core/breakpoint/breakpoint";
@mixin core-colour-samples { @mixin core-colour-samples {
#copystatus { #copystatus {
@@ -48,14 +50,14 @@
gap: 1rem; gap: 1rem;
margin-bottom: 1rem; margin-bottom: 1rem;
@include break(-lg) { @include breakpoint.break(-lg) {
display: grid; display: grid;
grid-template-columns: repeat(2, 1fr); grid-template-columns: repeat(2, 1fr);
max-width: 100%; max-width: 100%;
width: 100%; width: 100%;
} }
@include break(-sm) { @include breakpoint.break(-sm) {
grid-template-columns: auto; grid-template-columns: auto;
width: 100%; width: 100%;
max-width: 100%; max-width: 100%;
@@ -74,12 +76,12 @@
"lighter lighter lighter darker darker darker" "lighter lighter lighter darker darker darker"
"notes notes notes notes notes notes"; "notes notes notes notes notes notes";
grid-template-columns: repeat(6, 1fr); grid-template-columns: repeat(6, 1fr);
grid-template-rows: repeat(2, 1.5rem) repeat(4, max-content); // 3rem repeat(2, 2rem) 1.5rem repeat(3, max-content); grid-template-rows: repeat(2, 1.5rem) 10rem repeat(3, max-content); // 3rem repeat(2, 2rem) 1.5rem repeat(3, max-content);
padding: 1rem; padding: 1rem;
width: 20rem; width: 20rem;
max-width: 318px; max-width: 318px;
@include break(-lg) { @include breakpoint.break(-lg) {
width: 100%; width: 100%;
max-width: 100%; max-width: 100%;
} }
@@ -187,7 +189,7 @@
padding: .5rem; padding: .5rem;
width: 20rem; width: 20rem;
max-width: 318px; max-width: 318px;
height: max-content; height: 10.5rem;
display: grid; display: grid;
gap: .5rem; gap: .5rem;
@@ -230,7 +232,6 @@
display: block; display: block;
width: 100%; width: 100%;
place-self: stretch; place-self: stretch;
text-align: center;
span { span {
border: none; border: none;
font-size: .9rem; font-size: .9rem;

View File

@@ -1,4 +1,4 @@
/* /* ----------------------------------------------------------
* Variables * Variables
*/ */
@@ -15,15 +15,26 @@ $tooltip-dark-allow: false;
// We recommend explicitly using the underscore when referring to pattern scss // We recommend explicitly using the underscore when referring to pattern scss
// as you may have also created a version that compiles to css to display in // as you may have also created a version that compiles to css to display in
// your pattern. // your pattern.
@import "core"; @use "core";
@use "../../node_modules/prismjs/themes/prism";
@use "../../node_modules/prismjs/plugins/toolbar/prism-toolbar";
@use "../../node_modules/prismjs/plugins/line-numbers/prism-line-numbers";
@use "../pg/patterns/core/sticky-note/_sticky-note";
@use "../pg/patterns/core/switch/_switch";
@use "../pg/patterns/core/tooltip/_tooltip";
@use "../pg/patterns/core/breakpoint/_breakpoint";
@use "../pg/patterns/core/header/_header";
@use "../pg/patterns/core/tabs/_tabs";
@use "../pg/patterns/core/status/_status";
@include core.core-colour-samples;
@include tooltip.tooltip;
@include sticky-note.sticky-note;
@include status.status;
@import "../pg/patterns/core/sticky-note/_sticky-note";
@import "../pg/patterns/core/switch/_switch";
@import "../pg/patterns/core/tooltip/_tooltip";
@import "../pg/patterns/core/breakpoints/_breakpoints";
@import "../pg/patterns/core/header/_header";
@import "../pg/patterns/core/tabs/_tabs";
@import "../pg/patterns/core/status/_status";
* { * {
box-sizing: border-box; box-sizing: border-box;
@@ -32,19 +43,15 @@ $tooltip-dark-allow: false;
html { html {
font-family: $font-body; font-family: $font-body;
font-size: $font-size; font-size: $font-size;
@include break(-md) { @include breakpoint.break(-md) {
font-size: calc($font-size + 2pt); font-size: calc($font-size + 2pt);
} }
&.show-breakpoints { &.show-breakpoints {
@include breakpoint-debug; @include breakpoint.debug;
} }
} }
@include core-colour-samples;
@include tooltip;
@include sticky-note;
@include status;
article[data-status=deprecated]:not(.show-deprecated) { article[data-status=deprecated]:not(.show-deprecated) {
display: none; display: none;
@@ -65,7 +72,7 @@ body {
margin: 0 auto; margin: 0 auto;
width: 100vw; width: 100vw;
@include header; @include header.header;
nav { nav {
background-color: var(--colour-blue); background-color: var(--colour-blue);
@@ -84,7 +91,7 @@ body {
color: var(--colour-white); color: var(--colour-white);
text-decoration: none; text-decoration: none;
} }
@include break(md-) { @include breakpoint.break(md-) {
display: initial; display: initial;
} }
} }
@@ -98,7 +105,7 @@ body {
grid-row: 3; grid-row: 3;
grid-template-columns: auto repeat(2, max-content); grid-template-columns: auto repeat(2, max-content);
text-align: right; text-align: right;
@include switch; @include switch.switch;
label { label {
text-align: left;; text-align: left;;
} }
@@ -109,7 +116,7 @@ body {
grid-column: 1 / -1; grid-column: 1 / -1;
grid-row: 4; grid-row: 4;
@include break(-md) { @include breakpoint.break(-md) {
grid-row: 3; grid-row: 3;
padding: 0; padding: 0;
} }
@@ -117,7 +124,7 @@ body {
@supports(grid-area: auto) { @supports(grid-area: auto) {
display: grid; display: grid;
grid-template-columns: 1rem repeat(2, auto) 1rem; grid-template-columns: 1rem repeat(2, auto) 1rem;
@include break(md-) { @include breakpoint.break(md-) {
grid-template-columns: auto repeat(2, 22rem) auto; grid-template-columns: auto repeat(2, 22rem) auto;
} }
} }
@@ -135,7 +142,7 @@ body {
display: none; display: none;
} }
@include tabs { @include tabs.tabs {
pre { pre {
background-color: var(--colour-black-5); background-color: var(--colour-black-5);
font-size: .8rem; font-size: .8rem;
@@ -150,15 +157,12 @@ body {
display: grid; display: grid;
grid-gap: .5rem; grid-gap: .5rem;
grid-template-columns: max-content auto; grid-template-columns: max-content auto;
@include switch; @include switch.switch;
} }
} }
} }
} }
} }
// keep your prism modules
@import "../../node_modules/prismjs/themes/prism";
@import "../../node_modules/prismjs/plugins/toolbar/prism-toolbar";
@import "../../node_modules/prismjs/plugins/line-numbers/prism-line-numbers";