@webstir-io/webstir 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/README.md +69 -0
  2. package/assets/features/client_nav/client_nav.ts +469 -0
  3. package/assets/features/content_nav/content_nav.css +170 -0
  4. package/assets/features/content_nav/content_nav.ts +358 -0
  5. package/assets/features/router/router-types.ts +6 -0
  6. package/assets/features/router/router.ts +118 -0
  7. package/assets/features/search/search.css +204 -0
  8. package/assets/features/search/search.ts +627 -0
  9. package/assets/templates/api/src/backend/index.ts +13 -0
  10. package/assets/templates/api/src/backend/tsconfig.json +15 -0
  11. package/assets/templates/api/src/shared/router-types.ts +23 -0
  12. package/assets/templates/api/src/shared/tsconfig.json +10 -0
  13. package/assets/templates/api/src/shared/types/index.ts +4 -0
  14. package/assets/templates/full/src/backend/index.ts +13 -0
  15. package/assets/templates/full/src/backend/tsconfig.json +15 -0
  16. package/assets/templates/full/src/frontend/app/app.css +65 -0
  17. package/assets/templates/full/src/frontend/app/app.html +13 -0
  18. package/assets/templates/full/src/frontend/app/app.ts +188 -0
  19. package/assets/templates/full/src/frontend/app/error.ts +127 -0
  20. package/assets/templates/full/src/frontend/app/hmr.js +355 -0
  21. package/assets/templates/full/src/frontend/app/navigation.ts +8 -0
  22. package/assets/templates/full/src/frontend/app/refresh.js +114 -0
  23. package/assets/templates/full/src/frontend/app/router.ts +126 -0
  24. package/assets/templates/full/src/frontend/app/styles/base.css +2 -0
  25. package/assets/templates/full/src/frontend/app/styles/reset.css +48 -0
  26. package/assets/templates/full/src/frontend/pages/home/index.css +21 -0
  27. package/assets/templates/full/src/frontend/pages/home/index.html +10 -0
  28. package/assets/templates/full/src/frontend/pages/home/index.ts +18 -0
  29. package/assets/templates/full/src/frontend/pages/home/tests/home.test.ts +21 -0
  30. package/assets/templates/full/src/frontend/tsconfig.json +20 -0
  31. package/assets/templates/full/src/shared/router-types.ts +23 -0
  32. package/assets/templates/full/src/shared/tsconfig.json +10 -0
  33. package/assets/templates/full/src/shared/types/index.ts +4 -0
  34. package/assets/templates/shared/Errors.404.html +23 -0
  35. package/assets/templates/shared/Errors.500.html +23 -0
  36. package/assets/templates/shared/Errors.default.html +23 -0
  37. package/assets/templates/shared/types/global.d.ts +32 -0
  38. package/assets/templates/shared/types.global.d.ts +32 -0
  39. package/assets/templates/spa/src/frontend/app/app.css +65 -0
  40. package/assets/templates/spa/src/frontend/app/app.html +13 -0
  41. package/assets/templates/spa/src/frontend/app/app.ts +188 -0
  42. package/assets/templates/spa/src/frontend/app/error.ts +127 -0
  43. package/assets/templates/spa/src/frontend/app/hmr.js +355 -0
  44. package/assets/templates/spa/src/frontend/app/navigation.ts +8 -0
  45. package/assets/templates/spa/src/frontend/app/refresh.js +114 -0
  46. package/assets/templates/spa/src/frontend/app/router.ts +126 -0
  47. package/assets/templates/spa/src/frontend/app/styles/base.css +2 -0
  48. package/assets/templates/spa/src/frontend/app/styles/reset.css +48 -0
  49. package/assets/templates/spa/src/frontend/pages/home/index.css +21 -0
  50. package/assets/templates/spa/src/frontend/pages/home/index.html +10 -0
  51. package/assets/templates/spa/src/frontend/pages/home/index.ts +18 -0
  52. package/assets/templates/spa/src/frontend/pages/home/tests/home.test.ts +21 -0
  53. package/assets/templates/spa/src/frontend/tsconfig.json +20 -0
  54. package/assets/templates/spa/src/shared/router-types.ts +23 -0
  55. package/assets/templates/spa/src/shared/tsconfig.json +10 -0
  56. package/assets/templates/spa/src/shared/types/index.ts +4 -0
  57. package/assets/templates/ssg/src/frontend/app/app.css +12 -0
  58. package/assets/templates/ssg/src/frontend/app/app.html +43 -0
  59. package/assets/templates/ssg/src/frontend/app/app.ts +190 -0
  60. package/assets/templates/ssg/src/frontend/app/error.ts +127 -0
  61. package/assets/templates/ssg/src/frontend/app/hmr.js +370 -0
  62. package/assets/templates/ssg/src/frontend/app/refresh.js +163 -0
  63. package/assets/templates/ssg/src/frontend/app/scripts/components/drawer.ts +183 -0
  64. package/assets/templates/ssg/src/frontend/app/scripts/components/menu.ts +75 -0
  65. package/assets/templates/ssg/src/frontend/app/styles/base.css +77 -0
  66. package/assets/templates/ssg/src/frontend/app/styles/components/buttons.css +108 -0
  67. package/assets/templates/ssg/src/frontend/app/styles/components/drawer.css +12 -0
  68. package/assets/templates/ssg/src/frontend/app/styles/components/header.css +164 -0
  69. package/assets/templates/ssg/src/frontend/app/styles/components/markdown.css +25 -0
  70. package/assets/templates/ssg/src/frontend/app/styles/layout.css +41 -0
  71. package/assets/templates/ssg/src/frontend/app/styles/reset.css +56 -0
  72. package/assets/templates/ssg/src/frontend/app/styles/tokens.css +72 -0
  73. package/assets/templates/ssg/src/frontend/app/styles/utilities.css +14 -0
  74. package/assets/templates/ssg/src/frontend/content/_sidebar.json +14 -0
  75. package/assets/templates/ssg/src/frontend/content/content-pipeline.md +82 -0
  76. package/assets/templates/ssg/src/frontend/content/css-playbook.md +68 -0
  77. package/assets/templates/ssg/src/frontend/content/hosting.md +48 -0
  78. package/assets/templates/ssg/src/frontend/pages/about/index.css +33 -0
  79. package/assets/templates/ssg/src/frontend/pages/about/index.html +60 -0
  80. package/assets/templates/ssg/src/frontend/pages/docs/index.css +505 -0
  81. package/assets/templates/ssg/src/frontend/pages/docs/index.html +52 -0
  82. package/assets/templates/ssg/src/frontend/pages/docs/index.ts +495 -0
  83. package/assets/templates/ssg/src/frontend/pages/home/index.css +91 -0
  84. package/assets/templates/ssg/src/frontend/pages/home/index.html +38 -0
  85. package/assets/templates/ssg/src/frontend/pages/home/tests/home.test.ts +24 -0
  86. package/assets/templates/ssg/src/frontend/tsconfig.json +13 -0
  87. package/package.json +41 -0
  88. package/scripts/pack-standalone.mjs +127 -0
  89. package/scripts/sync-assets.mjs +87 -0
  90. package/src/add-backend.ts +164 -0
  91. package/src/add.ts +112 -0
  92. package/src/api-watch.ts +84 -0
  93. package/src/backend-inspect.ts +45 -0
  94. package/src/backend-runtime.ts +286 -0
  95. package/src/build-plan.ts +12 -0
  96. package/src/build.ts +10 -0
  97. package/src/cli.ts +569 -0
  98. package/src/compile-tests.ts +61 -0
  99. package/src/dev-server.ts +393 -0
  100. package/src/enable-assets.ts +196 -0
  101. package/src/enable.ts +477 -0
  102. package/src/execute.ts +85 -0
  103. package/src/format.ts +254 -0
  104. package/src/frontend-watch.ts +145 -0
  105. package/src/full-watch.ts +80 -0
  106. package/src/index.ts +20 -0
  107. package/src/init-assets.ts +96 -0
  108. package/src/init.ts +339 -0
  109. package/src/paths.ts +26 -0
  110. package/src/providers.ts +88 -0
  111. package/src/publish.ts +8 -0
  112. package/src/refresh.ts +56 -0
  113. package/src/repair.ts +414 -0
  114. package/src/runtime.ts +48 -0
  115. package/src/smoke.ts +161 -0
  116. package/src/stop-signal.ts +26 -0
  117. package/src/test.ts +215 -0
  118. package/src/types.ts +29 -0
  119. package/src/watch-daemon-client.ts +171 -0
  120. package/src/watch-events.ts +195 -0
  121. package/src/watch.ts +66 -0
  122. package/src/workspace-watcher.ts +251 -0
  123. package/src/workspace.ts +55 -0
@@ -0,0 +1,75 @@
1
+ import { createDrawer } from './drawer.js';
2
+
3
+ const menu = document.querySelector<HTMLElement>('[data-app-menu]');
4
+ const toggle = menu?.querySelector<HTMLButtonElement>('.app-menu__toggle');
5
+
6
+ function resolveBackdrop(root: HTMLElement | null): HTMLElement | null {
7
+ if (!root) {
8
+ return null;
9
+ }
10
+
11
+ const existing = root.querySelector<HTMLElement>('.ws-drawer-backdrop')
12
+ ?? document.querySelector<HTMLElement>('[data-drawer="menu"]');
13
+ if (existing) {
14
+ return existing;
15
+ }
16
+
17
+ const created = document.createElement('div');
18
+ created.className = 'ws-drawer-backdrop';
19
+ created.setAttribute('data-drawer', 'menu');
20
+ created.setAttribute('data-drawer-close', '');
21
+ created.setAttribute('aria-hidden', 'true');
22
+ document.body.appendChild(created);
23
+ return created;
24
+ }
25
+
26
+ const backdrop = resolveBackdrop(menu);
27
+
28
+ if (menu && toggle) {
29
+ const mobileQuery = window.matchMedia('(max-width: 40rem)');
30
+
31
+ const drawer = createDrawer({
32
+ root: menu,
33
+ openAttribute: null,
34
+ openClass: 'is-open',
35
+ bodyClass: 'webstir-menu-open',
36
+ overlay: {
37
+ headerSelector: '.app-header',
38
+ target: backdrop ?? document.body,
39
+ varName: '--ws-drawer-top'
40
+ },
41
+ isActive: () => mobileQuery.matches,
42
+ closeOnEscape: true,
43
+ closeOnOutside: true,
44
+ closeSelectors: ['.app-nav a', '.app-nav button:not([data-docs-folder])', '[data-drawer-close]'],
45
+ onOpen: () => toggle.setAttribute('aria-expanded', 'true'),
46
+ onClose: () => toggle.setAttribute('aria-expanded', 'false')
47
+ });
48
+
49
+ const syncMode = () => {
50
+ if (!mobileQuery.matches) {
51
+ drawer.close();
52
+ return;
53
+ }
54
+
55
+ drawer.close();
56
+ drawer.syncOverlayOffset();
57
+ };
58
+
59
+ syncMode();
60
+ mobileQuery.addEventListener('change', syncMode);
61
+
62
+ toggle.addEventListener('click', () => {
63
+ if (!mobileQuery.matches) {
64
+ return;
65
+ }
66
+
67
+ drawer.toggle();
68
+ });
69
+
70
+ window.addEventListener('resize', () => {
71
+ if (drawer.isOpen() && mobileQuery.matches) {
72
+ drawer.syncOverlayOffset();
73
+ }
74
+ });
75
+ }
@@ -0,0 +1,77 @@
1
+ @layer base {
2
+ html,
3
+ body {
4
+ height: 100%;
5
+ }
6
+
7
+ html {
8
+ scroll-padding-top: calc(
9
+ var(--ws-header-sticky-offset, 0px) + var(--ws-space-4)
10
+ );
11
+ }
12
+
13
+ body {
14
+ font-family: var(--ws-font-sans);
15
+ font-size: 16px;
16
+ line-height: 1.6;
17
+ color: var(--ws-fg);
18
+ background: var(--ws-bg);
19
+ padding-top: var(--ws-header-sticky-offset, 0px);
20
+ }
21
+
22
+ h1,
23
+ h2,
24
+ h3,
25
+ h4,
26
+ h5,
27
+ h6 {
28
+ color: var(--ws-fg);
29
+ line-height: 1.25;
30
+ margin: 0 0 0.5rem 0;
31
+ }
32
+
33
+ p {
34
+ margin: 0 0 1rem 0;
35
+ }
36
+
37
+ a {
38
+ color: var(--ws-accent);
39
+ text-decoration: underline;
40
+ text-underline-offset: 0.15em;
41
+ }
42
+
43
+ a:hover {
44
+ text-decoration-thickness: 0.12em;
45
+ }
46
+
47
+ a:focus-visible {
48
+ outline: 3px solid var(--ws-focus);
49
+ outline-offset: 2px;
50
+ border-radius: var(--ws-radius-1);
51
+ }
52
+
53
+ code {
54
+ font-family: var(--ws-font-mono);
55
+ font-size: 0.95em;
56
+ padding: 0.12em 0.4em;
57
+ border-radius: var(--ws-radius-1);
58
+ border: 1px solid var(--ws-border);
59
+ background: rgba(17, 24, 39, 0.06);
60
+ background: color-mix(in srgb, var(--ws-fg) 6%, transparent);
61
+ }
62
+
63
+ pre {
64
+ padding: 12px 14px;
65
+ border-radius: var(--ws-radius-2);
66
+ border: 1px solid var(--ws-border);
67
+ background: rgba(17, 24, 39, 0.04);
68
+ background: color-mix(in srgb, var(--ws-fg) 4%, transparent);
69
+ overflow-x: auto;
70
+ }
71
+
72
+ pre code {
73
+ padding: 0;
74
+ border: 0;
75
+ background: transparent;
76
+ }
77
+ }
@@ -0,0 +1,108 @@
1
+ @layer components {
2
+ /* Buttons */
3
+ :where([data-ui="btn"]),
4
+ .button {
5
+ display: inline-flex;
6
+ align-items: center;
7
+ justify-content: center;
8
+ padding: var(--ws-space-3) var(--ws-space-4);
9
+ border-radius: var(--ws-radius-2);
10
+ border: 1px solid var(--ws-border);
11
+ background: var(--ws-bg);
12
+ color: var(--ws-fg);
13
+ text-decoration: none;
14
+ font-weight: 650;
15
+ transition: background-color 120ms ease, border-color 120ms ease, filter 120ms ease;
16
+ cursor: pointer;
17
+ }
18
+
19
+ .ws-icon-button {
20
+ display: inline-flex;
21
+ align-items: center;
22
+ justify-content: center;
23
+ width: var(--ws-header-control-size, 2.6rem);
24
+ height: var(--ws-header-control-size, 2.6rem);
25
+ padding: 0;
26
+ border-radius: var(--ws-radius-1);
27
+ border: 1px solid transparent;
28
+ background: transparent;
29
+ color: var(--ws-fg);
30
+ cursor: pointer;
31
+ user-select: none;
32
+ transition: background-color 140ms ease, border-color 140ms ease;
33
+ }
34
+
35
+ .ws-icon-button svg {
36
+ width: var(--ws-icon-size, 20px);
37
+ height: var(--ws-icon-size, 20px);
38
+ }
39
+
40
+ .ws-icon-button:hover {
41
+ background: rgba(17, 24, 39, 0.04);
42
+ }
43
+
44
+ [data-theme="dark"] .ws-icon-button:hover {
45
+ background: rgba(255, 255, 255, 0.06);
46
+ }
47
+
48
+ .ws-icon-button:focus-visible {
49
+ outline: 0.1875rem solid var(--ws-focus);
50
+ outline-offset: 0.125rem;
51
+ border-radius: var(--ws-radius-1);
52
+ }
53
+
54
+ .ws-icon-button[aria-expanded="true"] {
55
+ border-color: rgba(37, 99, 235, 0.35);
56
+ background: rgba(37, 99, 235, 0.06);
57
+ }
58
+
59
+ @media (prefers-reduced-motion: reduce) {
60
+ .ws-icon-button {
61
+ transition: none;
62
+ }
63
+ }
64
+
65
+ :where([data-ui="btn"]):focus-visible,
66
+ .button:focus-visible {
67
+ outline: 0.1875rem solid var(--ws-focus);
68
+ outline-offset: 0.125rem;
69
+ }
70
+
71
+ :where([data-ui="btn"]):hover,
72
+ .button:hover {
73
+ text-decoration: none;
74
+ background: rgba(17, 24, 39, 0.03);
75
+ }
76
+
77
+ :where([data-ui="btn"][data-variant="solid"][data-tone="accent"]),
78
+ .button--primary {
79
+ background: var(--ws-accent);
80
+ color: #ffffff;
81
+ border-color: var(--ws-accent);
82
+ }
83
+
84
+ :where([data-ui="btn"][data-variant="solid"][data-tone="accent"]):hover,
85
+ .button--primary:hover {
86
+ background: var(--ws-accent-hover);
87
+ border-color: var(--ws-accent-hover);
88
+ }
89
+
90
+ :where([data-ui="btn"][data-variant="ghost"]) {
91
+ border-color: transparent;
92
+ background: transparent;
93
+ }
94
+
95
+ :where([data-ui="btn"][data-variant="ghost"]):hover {
96
+ background: rgba(17, 24, 39, 0.04);
97
+ }
98
+
99
+ :where([data-ui="btn"][data-size="sm"]) {
100
+ padding: var(--ws-space-2) var(--ws-space-3);
101
+ font-size: 0.95rem;
102
+ }
103
+
104
+ :where([data-ui="btn"][data-size="lg"]) {
105
+ padding: 0.875rem 1.125rem;
106
+ font-size: 1.05rem;
107
+ }
108
+ }
@@ -0,0 +1,12 @@
1
+ @layer components {
2
+ .ws-drawer-backdrop {
3
+ position: fixed;
4
+ inset: 0;
5
+ top: var(--ws-drawer-top, 0px);
6
+ background: rgba(0, 0, 0, 0.2);
7
+ backdrop-filter: blur(0.75rem);
8
+ z-index: 10;
9
+ opacity: 0;
10
+ pointer-events: none;
11
+ }
12
+ }
@@ -0,0 +1,164 @@
1
+ @layer components {
2
+ /* App header + primary nav */
3
+ .app-header {
4
+ position: fixed;
5
+ top: 0;
6
+ left: 0;
7
+ right: 0;
8
+ z-index: 30;
9
+ border-bottom: 1px solid var(--ws-border);
10
+ background: var(--ws-bg);
11
+ }
12
+
13
+ .app-header__inner {
14
+ --ws-container: var(--ws-shell-container, var(--ws-container));
15
+ display: flex;
16
+ align-items: center;
17
+ gap: var(--ws-space-5);
18
+ padding-block: var(--ws-header-block-padding, var(--ws-space-3));
19
+ position: relative;
20
+ }
21
+
22
+ .app-brand {
23
+ flex: 0 0 auto;
24
+ color: var(--ws-fg);
25
+ text-decoration: none;
26
+ font-weight: 700;
27
+ }
28
+
29
+ .app-brand:hover {
30
+ text-decoration: none;
31
+ }
32
+
33
+ .app-brand:focus-visible {
34
+ outline: 0.1875rem solid var(--ws-focus);
35
+ outline-offset: 0.125rem;
36
+ border-radius: var(--ws-radius-2);
37
+ }
38
+
39
+ .app-menu {
40
+ margin-left: auto;
41
+ flex: 0 0 auto;
42
+ display: flex;
43
+ align-items: center;
44
+ gap: var(--ws-space-2);
45
+ }
46
+
47
+
48
+ .app-menu__toggle.ws-icon-button {
49
+ display: none;
50
+ }
51
+
52
+ .app-menu__icon {
53
+ display: inline-flex;
54
+ align-items: center;
55
+ justify-content: center;
56
+ line-height: 0;
57
+ opacity: 0.9;
58
+ }
59
+
60
+ .app-menu__icon svg {
61
+ width: var(--ws-icon-size, 20px);
62
+ height: var(--ws-icon-size, 20px);
63
+ }
64
+
65
+ .app-menu__icon--close {
66
+ display: none;
67
+ }
68
+
69
+ .app-nav {
70
+ display: flex;
71
+ align-items: center;
72
+ flex-wrap: wrap;
73
+ gap: var(--ws-space-2);
74
+ min-width: 0;
75
+ order: 0;
76
+ }
77
+
78
+ .webstir-search__trigger {
79
+ order: 1;
80
+ }
81
+
82
+ .app-theme-toggle {
83
+ order: 2;
84
+ }
85
+
86
+ .app-menu__toggle {
87
+ order: 3;
88
+ }
89
+
90
+ .app-nav a {
91
+ display: inline-flex;
92
+ align-items: center;
93
+ min-height: var(--ws-header-control-size, 2.6rem);
94
+ color: var(--ws-fg);
95
+ text-decoration: none;
96
+ font-weight: 600;
97
+ padding: 0.5rem 0.625rem;
98
+ border-radius: var(--ws-radius-1);
99
+ }
100
+
101
+ .app-nav a:hover {
102
+ text-decoration: none;
103
+ background: rgba(17, 24, 39, 0.04);
104
+ }
105
+
106
+ .app-nav a:focus-visible {
107
+ outline: 0.1875rem solid var(--ws-focus);
108
+ outline-offset: 0.125rem;
109
+ border-radius: var(--ws-radius-1);
110
+ }
111
+
112
+ @media (max-width: 40rem) {
113
+ body.webstir-menu-open {
114
+ overflow: hidden;
115
+ }
116
+
117
+ .app-menu__toggle.ws-icon-button {
118
+ display: inline-flex;
119
+ }
120
+
121
+ .webstir-search__trigger {
122
+ order: -1;
123
+ }
124
+
125
+ .app-nav {
126
+ display: none;
127
+ flex-direction: column;
128
+ align-items: stretch;
129
+ flex-wrap: nowrap;
130
+ gap: var(--ws-space-1);
131
+ }
132
+
133
+ .app-menu.is-open .app-nav {
134
+ position: absolute;
135
+ inset-inline: 0;
136
+ top: 100%;
137
+ display: flex;
138
+ padding: var(--ws-space-2);
139
+ border: 1px solid var(--ws-border);
140
+ background: var(--ws-bg);
141
+ box-shadow: 0 1.5rem 3rem -1.5rem rgba(0, 0, 0, 0.28);
142
+ z-index: 20;
143
+ }
144
+
145
+ body.webstir-menu-open .ws-drawer-backdrop[data-drawer="menu"] {
146
+ opacity: 1;
147
+ pointer-events: auto;
148
+ }
149
+
150
+ .app-menu.is-open .app-menu__icon--open {
151
+ display: none;
152
+ }
153
+
154
+ .app-menu.is-open .app-menu__icon--close {
155
+ display: inline-flex;
156
+ }
157
+
158
+ .app-menu.is-open .app-nav a,
159
+ .app-menu.is-open .app-nav button {
160
+ width: 100%;
161
+ justify-content: space-between;
162
+ }
163
+ }
164
+ }
@@ -0,0 +1,25 @@
1
+ @layer components {
2
+ /* Markdown content pages (main > article) */
3
+ main > article {
4
+ max-width: var(--ws-container);
5
+ margin: 0 auto;
6
+ padding: 3rem var(--ws-container-pad, 1rem) 6rem;
7
+ }
8
+
9
+ main > article h1 {
10
+ margin-bottom: 1rem;
11
+ }
12
+
13
+ main > article h2 {
14
+ margin-top: 2rem;
15
+ }
16
+
17
+ main > article ul,
18
+ main > article ol {
19
+ padding-left: 1.25rem;
20
+ }
21
+
22
+ main > article li {
23
+ margin: 0.625rem 0;
24
+ }
25
+ }
@@ -0,0 +1,41 @@
1
+ @layer layout {
2
+ .ws-container {
3
+ width: 100%;
4
+ max-width: var(--ws-container);
5
+ margin-left: auto;
6
+ margin-right: auto;
7
+ padding-left: max(var(--ws-container-pad, var(--ws-space-4)), env(safe-area-inset-left));
8
+ padding-right: max(var(--ws-container-pad, var(--ws-space-4)), env(safe-area-inset-right));
9
+ }
10
+
11
+ .ws-stack {
12
+ display: flex;
13
+ flex-direction: column;
14
+ gap: var(--ws-gap, var(--ws-space-6));
15
+ }
16
+
17
+ .ws-cluster {
18
+ display: flex;
19
+ flex-wrap: wrap;
20
+ align-items: center;
21
+ gap: var(--ws-gap, var(--ws-space-3));
22
+ }
23
+
24
+ .ws-grid {
25
+ display: grid;
26
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, var(--ws-grid-min, 16rem)), 1fr));
27
+ gap: var(--ws-gap, var(--ws-space-4));
28
+ }
29
+
30
+ .ws-sidebar {
31
+ display: grid;
32
+ grid-template-columns: minmax(0, 1fr);
33
+ gap: var(--ws-gap, var(--ws-space-6));
34
+ }
35
+
36
+ @media (min-width: 48rem) {
37
+ .ws-sidebar {
38
+ grid-template-columns: minmax(0, 1fr) minmax(16rem, var(--ws-sidebar, 20rem));
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,56 @@
1
+ @layer reset {
2
+ /* Basic CSS Reset */
3
+ *,
4
+ *::before,
5
+ *::after {
6
+ box-sizing: border-box;
7
+ }
8
+
9
+ html,
10
+ body,
11
+ h1,
12
+ h2,
13
+ h3,
14
+ h4,
15
+ h5,
16
+ h6,
17
+ p,
18
+ figure,
19
+ blockquote,
20
+ dl,
21
+ dd {
22
+ margin: 0;
23
+ }
24
+
25
+ ul[role='list'],
26
+ ol[role='list'] {
27
+ list-style: none;
28
+ }
29
+
30
+ a:not([class]) {
31
+ text-decoration-skip-ink: auto;
32
+ }
33
+
34
+ img,
35
+ picture {
36
+ max-width: 100%;
37
+ display: block;
38
+ }
39
+
40
+ input,
41
+ button,
42
+ textarea,
43
+ select {
44
+ font: inherit;
45
+ }
46
+
47
+ @media (prefers-reduced-motion: reduce) {
48
+ *,
49
+ *::before,
50
+ *::after {
51
+ animation-duration: 0.01ms !important;
52
+ animation-iteration-count: 1 !important;
53
+ transition-duration: 0.01ms !important;
54
+ }
55
+ }
56
+ }
@@ -0,0 +1,72 @@
1
+ @layer tokens {
2
+ :root {
3
+ color-scheme: light;
4
+
5
+ --ws-bg: #ffffff;
6
+ --ws-fg: #111827;
7
+ --ws-muted: #6b7280;
8
+ --ws-border: #e5e7eb;
9
+
10
+ --ws-accent: #2563eb;
11
+ --ws-accent-hover: #1d4ed8;
12
+ --ws-focus: rgba(37, 99, 235, 0.35);
13
+
14
+ --ws-radius-1: 8px;
15
+ --ws-radius-2: 10px;
16
+ --ws-radius-3: 12px;
17
+
18
+ --ws-gutter: clamp(1rem, 2.4vw, 2rem);
19
+ --ws-container-pad: calc(var(--ws-gutter) + var(--ws-space-2));
20
+
21
+ --ws-header-control-size: 2.6rem;
22
+ --ws-icon-size: 20px;
23
+ --ws-header-block-padding: var(--ws-space-3);
24
+ --ws-header-sticky-offset: calc(
25
+ var(--ws-header-control-size) + (var(--ws-header-block-padding) * 2) + 1px
26
+ );
27
+ --ws-sticky-gap: var(--ws-space-4);
28
+
29
+ /* Layout sizing (prefer rem for consistency across zoom/devices) */
30
+ --ws-container: 72rem;
31
+ --ws-shell-container: 80rem;
32
+ --ws-article: 72ch;
33
+ --ws-docs-sidebar: 16.25rem;
34
+ --ws-docs-toc: 15rem;
35
+
36
+ --ws-space-1: 0.25rem;
37
+ --ws-space-2: 0.5rem;
38
+ --ws-space-3: 0.75rem;
39
+ --ws-space-4: 1rem;
40
+ --ws-space-5: 1.25rem;
41
+ --ws-space-6: 1.5rem;
42
+ --ws-space-7: 1.75rem;
43
+ --ws-space-8: 2rem;
44
+
45
+ --ws-font-sans: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
46
+ Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue",
47
+ Arial, sans-serif;
48
+ --ws-font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas,
49
+ "Liberation Mono", "Courier New", monospace;
50
+ }
51
+
52
+ @media (min-width: 68.75rem) {
53
+ :root {
54
+ --ws-container: 96rem;
55
+ --ws-shell-container: 104rem;
56
+ --ws-article: 88ch;
57
+ }
58
+ }
59
+
60
+ [data-theme="dark"] {
61
+ color-scheme: dark;
62
+
63
+ --ws-bg: #0b1220;
64
+ --ws-fg: #e5e7eb;
65
+ --ws-muted: #94a3b8;
66
+ --ws-border: rgba(148, 163, 184, 0.24);
67
+
68
+ --ws-accent: #60a5fa;
69
+ --ws-accent-hover: #3b82f6;
70
+ --ws-focus: rgba(96, 165, 250, 0.35);
71
+ }
72
+ }
@@ -0,0 +1,14 @@
1
+ @layer utilities {
2
+ .sr-only {
3
+ position: absolute;
4
+ width: 1px;
5
+ height: 1px;
6
+ padding: 0;
7
+ margin: -1px;
8
+ overflow: hidden;
9
+ clip: rect(0, 0, 0, 0);
10
+ clip-path: inset(50%);
11
+ white-space: nowrap;
12
+ border: 0;
13
+ }
14
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "pages": [
3
+ {
4
+ "path": "/docs/content-pipeline/",
5
+ "title": "Content pipeline",
6
+ "order": 1
7
+ },
8
+ {
9
+ "path": "/docs/hosting/",
10
+ "title": "Deploying your site",
11
+ "order": 2
12
+ }
13
+ ]
14
+ }