@ketvietlab/design-system 0.1.3

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 (106) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +48 -0
  3. package/dist/catalogue/catalogue.css +344 -0
  4. package/dist/catalogue/index.d.ts +22 -0
  5. package/dist/catalogue/index.d.ts.map +1 -0
  6. package/dist/catalogue/index.js +421 -0
  7. package/dist/catalogue/index.js.map +1 -0
  8. package/dist/catalogue/page-surfaces.d.ts +15 -0
  9. package/dist/catalogue/page-surfaces.d.ts.map +1 -0
  10. package/dist/catalogue/page-surfaces.js +162 -0
  11. package/dist/catalogue/page-surfaces.js.map +1 -0
  12. package/dist/catalogue/styles.css +2 -0
  13. package/dist/contract/index.d.ts +3 -0
  14. package/dist/contract/index.d.ts.map +1 -0
  15. package/dist/contract/index.js +37 -0
  16. package/dist/contract/index.js.map +1 -0
  17. package/dist/foundations/reset.css +42 -0
  18. package/dist/foundations/tokens.css +305 -0
  19. package/dist/index.d.ts +35 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +20 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/layouts/index.d.ts +68 -0
  24. package/dist/layouts/index.d.ts.map +1 -0
  25. package/dist/layouts/index.js +66 -0
  26. package/dist/layouts/index.js.map +1 -0
  27. package/dist/layouts/layouts.css +332 -0
  28. package/dist/layouts/shell.css +154 -0
  29. package/dist/layouts/shell.d.ts +27 -0
  30. package/dist/layouts/shell.d.ts.map +1 -0
  31. package/dist/layouts/shell.js +24 -0
  32. package/dist/layouts/shell.js.map +1 -0
  33. package/dist/patterns/board-page.d.ts +14 -0
  34. package/dist/patterns/board-page.d.ts.map +1 -0
  35. package/dist/patterns/board-page.js +28 -0
  36. package/dist/patterns/board-page.js.map +1 -0
  37. package/dist/patterns/dashboard-page.d.ts +13 -0
  38. package/dist/patterns/dashboard-page.d.ts.map +1 -0
  39. package/dist/patterns/dashboard-page.js +25 -0
  40. package/dist/patterns/dashboard-page.js.map +1 -0
  41. package/dist/patterns/data-table.d.ts +26 -0
  42. package/dist/patterns/data-table.d.ts.map +1 -0
  43. package/dist/patterns/data-table.js +6 -0
  44. package/dist/patterns/data-table.js.map +1 -0
  45. package/dist/patterns/form-page.d.ts +8 -0
  46. package/dist/patterns/form-page.d.ts.map +1 -0
  47. package/dist/patterns/form-page.js +22 -0
  48. package/dist/patterns/form-page.js.map +1 -0
  49. package/dist/patterns/list-page.d.ts +31 -0
  50. package/dist/patterns/list-page.d.ts.map +1 -0
  51. package/dist/patterns/list-page.js +41 -0
  52. package/dist/patterns/list-page.js.map +1 -0
  53. package/dist/patterns/modal-sheet.d.ts +11 -0
  54. package/dist/patterns/modal-sheet.d.ts.map +1 -0
  55. package/dist/patterns/modal-sheet.js +11 -0
  56. package/dist/patterns/modal-sheet.js.map +1 -0
  57. package/dist/patterns/page-shell.d.ts +24 -0
  58. package/dist/patterns/page-shell.d.ts.map +1 -0
  59. package/dist/patterns/page-shell.js +11 -0
  60. package/dist/patterns/page-shell.js.map +1 -0
  61. package/dist/patterns/patterns.css +1435 -0
  62. package/dist/patterns/pipeline.d.ts +29 -0
  63. package/dist/patterns/pipeline.d.ts.map +1 -0
  64. package/dist/patterns/pipeline.js +26 -0
  65. package/dist/patterns/pipeline.js.map +1 -0
  66. package/dist/patterns/record-form.d.ts +18 -0
  67. package/dist/patterns/record-form.d.ts.map +1 -0
  68. package/dist/patterns/record-form.js +14 -0
  69. package/dist/patterns/record-form.js.map +1 -0
  70. package/dist/patterns/record-page.d.ts +30 -0
  71. package/dist/patterns/record-page.d.ts.map +1 -0
  72. package/dist/patterns/record-page.js +29 -0
  73. package/dist/patterns/record-page.js.map +1 -0
  74. package/dist/patterns/workspace-page.d.ts +23 -0
  75. package/dist/patterns/workspace-page.d.ts.map +1 -0
  76. package/dist/patterns/workspace-page.js +26 -0
  77. package/dist/patterns/workspace-page.js.map +1 -0
  78. package/dist/primitives/actions.d.ts +30 -0
  79. package/dist/primitives/actions.d.ts.map +1 -0
  80. package/dist/primitives/actions.js +8 -0
  81. package/dist/primitives/actions.js.map +1 -0
  82. package/dist/primitives/feedback.d.ts +19 -0
  83. package/dist/primitives/feedback.d.ts.map +1 -0
  84. package/dist/primitives/feedback.js +23 -0
  85. package/dist/primitives/feedback.js.map +1 -0
  86. package/dist/primitives/field.d.ts +22 -0
  87. package/dist/primitives/field.d.ts.map +1 -0
  88. package/dist/primitives/field.js +29 -0
  89. package/dist/primitives/field.js.map +1 -0
  90. package/dist/primitives/navigation.css +99 -0
  91. package/dist/primitives/navigation.d.ts +26 -0
  92. package/dist/primitives/navigation.d.ts.map +1 -0
  93. package/dist/primitives/navigation.js +16 -0
  94. package/dist/primitives/navigation.js.map +1 -0
  95. package/dist/primitives/primitives.css +489 -0
  96. package/dist/primitives/progress.css +46 -0
  97. package/dist/primitives/progress.d.ts +10 -0
  98. package/dist/primitives/progress.d.ts.map +1 -0
  99. package/dist/primitives/progress.js +13 -0
  100. package/dist/primitives/progress.js.map +1 -0
  101. package/dist/primitives/status.d.ts +27 -0
  102. package/dist/primitives/status.d.ts.map +1 -0
  103. package/dist/primitives/status.js +16 -0
  104. package/dist/primitives/status.js.map +1 -0
  105. package/dist/styles.css +9 -0
  106. package/package.json +58 -0
@@ -0,0 +1,68 @@
1
+ import type { JSXChild, TemplateResult } from '@ketvietlab/ketjs-view';
2
+ import type { Tone } from '../primitives/status.tsx';
3
+ export declare const HOOKS: readonly ['stack', 'inline', 'grid', 'surface', 'disclosure', 'disclosure-summary', 'disclosure-body', 'section', 'section-head', 'section-eyebrow', 'section-title', 'section-description', 'section-actions', 'section-body', 'content-card', 'card-head', 'card-title', 'card-summary', 'card-body', 'card-meta', 'card-actions', 'metric', 'metric-icon', 'metric-label', 'metric-value', 'metric-detail'];
4
+ export { AppShell, Page, PageHeader, RecordCanvas, RecordSection } from './shell.tsx';
5
+ export declare const Stack: (props: {
6
+ items: readonly JSXChild[];
7
+ gap?: 'compact' | 'default' | 'loose';
8
+ }) => TemplateResult;
9
+ export declare const Inline: (props: {
10
+ items: readonly JSXChild[];
11
+ }) => TemplateResult;
12
+ export declare const Grid: (props: {
13
+ items: readonly JSXChild[];
14
+ columns?: 2 | 3 | 4;
15
+ }) => TemplateResult;
16
+ export declare const Surface: (props: {
17
+ body: JSXChild;
18
+ tone?: 'default' | 'subtle' | 'raised';
19
+ padding?: 'none' | 'compact' | 'default';
20
+ }) => TemplateResult;
21
+ /** Native, keyboard-accessible progressive disclosure for dense secondary detail. */
22
+ export declare const Disclosure: (props: {
23
+ summary: string;
24
+ body: JSXChild;
25
+ open?: boolean;
26
+ }) => TemplateResult;
27
+ export declare const Section: (props: {
28
+ title: string;
29
+ body: JSXChild;
30
+ description?: string | null;
31
+ eyebrow?: string | null;
32
+ actions?: JSXChild;
33
+ }) => TemplateResult;
34
+ export declare const ContentCard: (props: {
35
+ title: string;
36
+ summary?: string | null;
37
+ body?: JSXChild;
38
+ meta?: JSXChild;
39
+ actions?: JSXChild;
40
+ href?: string | null;
41
+ selected?: boolean;
42
+ }) => TemplateResult;
43
+ /**
44
+ * One number, with the context that makes it mean something.
45
+ *
46
+ * `tone` colours a dot beside the label and nothing else. The number itself stays
47
+ * in the page's ink: a KPI row is read by comparing figures, and four differently
48
+ * coloured figures are compared by colour instead. The dot is drawn only when a
49
+ * tone is passed, so a metric that has no state to report does not grow a grey
50
+ * bullet that means nothing.
51
+ *
52
+ * `href` makes the whole card the link rather than the label, because the card is
53
+ * what the pointer is already over. There is nothing else inside a metric to
54
+ * click, which is exactly why `ContentCard` does the opposite.
55
+ */
56
+ export declare const Metric: (props: {
57
+ label: string;
58
+ value: string | number;
59
+ detail?: string | null;
60
+ tone?: Tone;
61
+ /**
62
+ * A glyph naming the quantity, in a tile beside it. Decorative: the label is
63
+ * the name of the number, so this is hidden from assistive technology.
64
+ */
65
+ icon?: JSXChild;
66
+ href?: string | null;
67
+ }) => TemplateResult;
68
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../packages/design-system/src/layouts/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACtE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAA;AAEpD,eAAO,MAAM,KAAK,YAChB,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAAS,EACT,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,WAAW,EACX,YAAY,EACZ,cAAc,EACd,WAAW,EACX,WAAW,EACX,cAAc,EACd,QAAQ,EACR,aAAa,EACb,cAAc,EACd,cAAc,EACd,eAAe,CACP,CAAA;AAEV,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAcrF,eAAO,MAAM,KAAK,UAAW;IAC3B,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAA;IAC1B,GAAG,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,CAAA;CACtC,KAAG,cAIH,CAAA;AAED,eAAO,MAAM,MAAM,UAAW;IAAE,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAA;CAAE,KAAG,cAI9D,CAAA;AAED,eAAO,MAAM,IAAI,UAAW;IAAE,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;CAAE,KAAG,cAIjF,CAAA;AAED,eAAO,MAAM,OAAO,UAAW;IAC7B,IAAI,EAAE,QAAQ,CAAA;IACd,IAAI,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAA;IACtC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAA;CACzC,KAAG,cAIH,CAAA;AAED,qFAAqF;AACrF,eAAO,MAAM,UAAU,UAAW;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,KAAG,cAKvF,CAAA;AAED,eAAO,MAAM,OAAO,UAAW;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,QAAQ,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,OAAO,CAAC,EAAE,QAAQ,CAAA;CACnB,KAAG,cAYH,CAAA;AAED,eAAO,MAAM,WAAW,UAAW;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,OAAO,CAAC,EAAE,QAAQ,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,KAAG,cAcH,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,MAAM,UAAW;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,IAAI,CAAC,EAAE,IAAI,CAAA;IACX;;;OAGG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB,KAAG,cA8BH,CAAA"}
@@ -0,0 +1,66 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "@ketvietlab/ketjs-view/jsx-runtime";
2
+ import { each } from '@ketvietlab/ketjs-view';
3
+ export const HOOKS = [
4
+ 'stack',
5
+ 'inline',
6
+ 'grid',
7
+ 'surface',
8
+ 'disclosure',
9
+ 'disclosure-summary',
10
+ 'disclosure-body',
11
+ 'section',
12
+ 'section-head',
13
+ 'section-eyebrow',
14
+ 'section-title',
15
+ 'section-description',
16
+ 'section-actions',
17
+ 'section-body',
18
+ 'content-card',
19
+ 'card-head',
20
+ 'card-title',
21
+ 'card-summary',
22
+ 'card-body',
23
+ 'card-meta',
24
+ 'card-actions',
25
+ 'metric',
26
+ 'metric-icon',
27
+ 'metric-label',
28
+ 'metric-value',
29
+ 'metric-detail',
30
+ ];
31
+ export { AppShell, Page, PageHeader, RecordCanvas, RecordSection } from './shell.js';
32
+ const Items = (props) => (_jsx(_Fragment, { children: each(props.items, (_, index) => index, (item) => (_jsx(_Fragment, { children: item }))) }));
33
+ export const Stack = (props) => (_jsx("div", { "data-ui": "stack", "data-gap": props.gap ?? 'default', children: _jsx(Items, { items: props.items }) }));
34
+ export const Inline = (props) => (_jsx("div", { "data-ui": "inline", children: _jsx(Items, { items: props.items }) }));
35
+ export const Grid = (props) => (_jsx("div", { "data-ui": "grid", "data-columns": String(props.columns ?? 3), children: _jsx(Items, { items: props.items }) }));
36
+ export const Surface = (props) => (_jsx("div", { "data-ui": "surface", "data-tone": props.tone ?? 'default', "data-padding": props.padding ?? 'default', children: props.body }));
37
+ /** Native, keyboard-accessible progressive disclosure for dense secondary detail. */
38
+ export const Disclosure = (props) => (_jsxs("details", { "data-ui": "disclosure", open: props.open === true ? true : undefined, children: [_jsx("summary", { "data-ui": "disclosure-summary", children: props.summary }), _jsx("div", { "data-ui": "disclosure-body", children: props.body })] }));
39
+ export const Section = (props) => (_jsxs("section", { "data-ui": "section", children: [_jsxs("header", { "data-ui": "section-head", children: [_jsxs("div", { children: [!!props.eyebrow && _jsx("p", { "data-ui": "section-eyebrow", children: props.eyebrow }), _jsx("h2", { "data-ui": "section-title", children: props.title }), !!props.description && _jsx("p", { "data-ui": "section-description", children: props.description })] }), props.actions !== undefined && _jsx("div", { "data-ui": "section-actions", children: props.actions })] }), _jsx("div", { "data-ui": "section-body", children: props.body })] }));
40
+ export const ContentCard = (props) => (_jsxs("article", { "data-ui": "content-card", "data-interactive": String(!!props.href), "data-selected": String(props.selected === true), children: [_jsxs("header", { "data-ui": "card-head", children: [_jsx("h3", { "data-ui": "card-title", children: props.href ? _jsx("a", { href: props.href, children: props.title }) : props.title }), !!props.summary && _jsx("p", { "data-ui": "card-summary", children: props.summary })] }), props.body !== undefined && _jsx("div", { "data-ui": "card-body", children: props.body }), props.meta !== undefined && _jsx("div", { "data-ui": "card-meta", children: props.meta }), props.actions !== undefined && _jsx("div", { "data-ui": "card-actions", children: props.actions })] }));
41
+ /**
42
+ * One number, with the context that makes it mean something.
43
+ *
44
+ * `tone` colours a dot beside the label and nothing else. The number itself stays
45
+ * in the page's ink: a KPI row is read by comparing figures, and four differently
46
+ * coloured figures are compared by colour instead. The dot is drawn only when a
47
+ * tone is passed, so a metric that has no state to report does not grow a grey
48
+ * bullet that means nothing.
49
+ *
50
+ * `href` makes the whole card the link rather than the label, because the card is
51
+ * what the pointer is already over. There is nothing else inside a metric to
52
+ * click, which is exactly why `ContentCard` does the opposite.
53
+ */
54
+ export const Metric = (props) => {
55
+ const attributes = {
56
+ 'data-ui': 'metric',
57
+ 'data-tone': props.tone ?? 'neutral',
58
+ // One marker to a card, never two. The dot reports state for a metric that
59
+ // has no glyph; where there is a glyph, the glyph is already the thing the
60
+ // eye lands on, and a coloured bullet beside the label competes with it.
61
+ 'data-dot': String(props.tone !== undefined && props.icon === undefined),
62
+ };
63
+ const body = (_jsxs(_Fragment, { children: [props.icon !== undefined && (_jsx("span", { "data-ui": "metric-icon", "aria-hidden": "true", children: props.icon })), _jsx("p", { "data-ui": "metric-label", children: props.label }), _jsx("p", { "data-ui": "metric-value", children: String(props.value) }), !!props.detail && _jsx("p", { "data-ui": "metric-detail", children: props.detail })] }));
64
+ return props.href ? (_jsx("a", { ...attributes, "data-interactive": "true", href: props.href, children: body })) : (_jsx("article", { ...attributes, "data-interactive": "false", children: body }));
65
+ };
66
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/design-system/src/layouts/index.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,332 @@
1
+ @layer ket.app {
2
+ :where([data-kv-design-system]) [data-ui="stack"] {
3
+ display: grid;
4
+ gap: var(--kv-space-4);
5
+ }
6
+
7
+ :where([data-kv-design-system]) [data-ui="stack"][data-gap="compact"] {
8
+ gap: var(--kv-space-2);
9
+ }
10
+
11
+ :where([data-kv-design-system]) [data-ui="stack"][data-gap="loose"] {
12
+ gap: var(--kv-space-8);
13
+ }
14
+
15
+ :where([data-kv-design-system]) [data-ui="inline"] {
16
+ display: flex;
17
+ flex-wrap: wrap;
18
+ align-items: center;
19
+ gap: var(--kv-space-2);
20
+ }
21
+
22
+ :where([data-kv-design-system]) [data-ui="grid"] {
23
+ display: grid;
24
+ grid-template-columns: repeat(var(--kv-grid-columns, 3), minmax(0, 1fr));
25
+ gap: var(--kv-space-4);
26
+ }
27
+
28
+ :where([data-kv-design-system]) [data-ui="grid"][data-columns="2"] {
29
+ --kv-grid-columns: 2;
30
+ }
31
+
32
+ :where([data-kv-design-system]) [data-ui="grid"][data-columns="3"] {
33
+ --kv-grid-columns: 3;
34
+ }
35
+
36
+ :where([data-kv-design-system]) [data-ui="grid"][data-columns="4"] {
37
+ --kv-grid-columns: 4;
38
+ }
39
+
40
+ :where([data-kv-design-system]) [data-ui="surface"] {
41
+ min-width: 0;
42
+ border: 1px solid var(--kv-panel-border);
43
+ border-radius: var(--kv-radius-md);
44
+ background: var(--kv-panel-bg);
45
+ }
46
+
47
+ :where([data-kv-design-system]) [data-ui="surface"][data-tone="subtle"] {
48
+ background: var(--kv-panel-bg-subtle);
49
+ }
50
+
51
+ :where([data-kv-design-system]) [data-ui="surface"][data-tone="raised"] {
52
+ background: var(--kv-surface-raised);
53
+ box-shadow: var(--kv-shadow-md);
54
+ }
55
+
56
+ :where([data-kv-design-system]) [data-ui="surface"][data-padding="compact"] {
57
+ padding: var(--kv-space-3);
58
+ }
59
+
60
+ :where([data-kv-design-system]) [data-ui="surface"][data-padding="default"] {
61
+ padding: var(--kv-space-5);
62
+ }
63
+
64
+ :where([data-kv-design-system]) [data-ui="disclosure"] {
65
+ min-width: 0;
66
+ overflow: clip;
67
+ border: 1px solid var(--kv-panel-border);
68
+ border-radius: var(--kv-radius-md);
69
+ background: var(--kv-panel-bg-subtle);
70
+ }
71
+
72
+ :where([data-kv-design-system]) [data-ui="disclosure-summary"] {
73
+ display: flex;
74
+ align-items: center;
75
+ justify-content: space-between;
76
+ gap: var(--kv-space-3);
77
+ padding: var(--kv-space-3) var(--kv-space-4);
78
+ color: var(--kv-color-ink-secondary);
79
+ font-size: var(--kv-text-sm);
80
+ font-weight: 700;
81
+ cursor: pointer;
82
+ list-style: none;
83
+ }
84
+
85
+ :where([data-kv-design-system]) [data-ui="disclosure-summary"]::-webkit-details-marker {
86
+ display: none;
87
+ }
88
+
89
+ :where([data-kv-design-system]) [data-ui="disclosure-summary"]::after {
90
+ content: "+";
91
+ flex: 0 0 auto;
92
+ color: var(--kv-color-ink-muted);
93
+ font-family: var(--kv-font-mono);
94
+ font-weight: 600;
95
+ transition: transform var(--kv-motion-fast);
96
+ }
97
+
98
+ :where([data-kv-design-system]) [data-ui="disclosure"][open] > [data-ui="disclosure-summary"] {
99
+ border-bottom: 1px solid var(--kv-color-line);
100
+ }
101
+
102
+ :where([data-kv-design-system]) [data-ui="disclosure"][open] > [data-ui="disclosure-summary"]::after {
103
+ transform: rotate(45deg);
104
+ }
105
+
106
+ :where([data-kv-design-system]) [data-ui="disclosure-body"] {
107
+ min-width: 0;
108
+ padding: var(--kv-space-4);
109
+ }
110
+
111
+ :where([data-kv-design-system]) [data-ui="section"] {
112
+ display: grid;
113
+ gap: var(--kv-space-3);
114
+ }
115
+
116
+ :where([data-kv-design-system]) [data-ui="section-head"] {
117
+ display: flex;
118
+ align-items: end;
119
+ justify-content: space-between;
120
+ gap: var(--kv-space-4);
121
+ padding-bottom: var(--kv-space-3);
122
+ border-bottom: 1px solid var(--kv-color-line);
123
+ }
124
+
125
+ :where([data-kv-design-system]) [data-ui="section-eyebrow"] {
126
+ margin-bottom: var(--kv-space-1);
127
+ color: var(--kv-color-accent);
128
+ font-family: var(--kv-font-mono);
129
+ font-size: var(--kv-text-xs);
130
+ font-weight: 800;
131
+ letter-spacing: 0.1em;
132
+ text-transform: uppercase;
133
+ }
134
+
135
+ :where([data-kv-design-system]) [data-ui="section-title"] {
136
+ margin-bottom: 0;
137
+ font-size: var(--kv-text-md);
138
+ line-height: var(--kv-leading-tight);
139
+ }
140
+
141
+ :where([data-kv-design-system]) [data-ui="section-description"] {
142
+ max-width: 52rem;
143
+ margin: var(--kv-space-1) 0 0;
144
+ color: var(--kv-color-ink-muted);
145
+ font-size: var(--kv-text-sm);
146
+ }
147
+
148
+ :where([data-kv-design-system]) [data-ui="section-actions"] {
149
+ flex: 0 0 auto;
150
+ }
151
+
152
+ :where([data-kv-design-system]) [data-ui="section-body"] {
153
+ min-width: 0;
154
+ }
155
+
156
+ :where([data-kv-design-system]) [data-ui="content-card"] {
157
+ display: grid;
158
+ min-width: 0;
159
+ gap: var(--kv-space-3);
160
+ padding: var(--kv-space-4);
161
+ border: 1px solid var(--kv-panel-border);
162
+ border-radius: var(--kv-radius-md);
163
+ background: var(--kv-panel-bg);
164
+ transition:
165
+ border-color var(--kv-motion-fast),
166
+ background var(--kv-motion-fast);
167
+ }
168
+
169
+ :where([data-kv-design-system]) [data-ui="content-card"][data-interactive="true"]:hover {
170
+ border-color: var(--kv-border-default);
171
+ background: var(--kv-surface-raised);
172
+ }
173
+
174
+ :where([data-kv-design-system]) [data-ui="content-card"][data-selected="true"] {
175
+ border-color: var(--kv-accent-border);
176
+ background: var(--kv-accent-subtle);
177
+ }
178
+
179
+ :where([data-kv-design-system]) [data-ui="card-head"] {
180
+ min-width: 0;
181
+ }
182
+
183
+ :where([data-kv-design-system]) [data-ui="card-title"] {
184
+ margin-bottom: 0;
185
+ font-size: var(--kv-text-base);
186
+ }
187
+
188
+ :where([data-kv-design-system]) [data-ui="card-title"] a {
189
+ color: inherit;
190
+ text-decoration: none;
191
+ }
192
+
193
+ :where([data-kv-design-system]) [data-ui="card-summary"] {
194
+ margin: var(--kv-space-1) 0 0;
195
+ color: var(--kv-color-ink-muted);
196
+ font-size: var(--kv-text-sm);
197
+ }
198
+
199
+ :where([data-kv-design-system]) [data-ui="card-body"] {
200
+ color: var(--kv-color-ink-secondary);
201
+ font-size: var(--kv-text-sm);
202
+ }
203
+
204
+ :where([data-kv-design-system]) [data-ui="card-meta"] {
205
+ align-self: end;
206
+ }
207
+
208
+ :where([data-kv-design-system]) [data-ui="card-actions"] {
209
+ padding-top: var(--kv-space-3);
210
+ border-top: 1px solid var(--kv-color-line);
211
+ }
212
+
213
+ :where([data-kv-design-system]) [data-ui="metric"] {
214
+ display: grid;
215
+ min-width: 0;
216
+ min-height: 6.75rem;
217
+ align-content: start;
218
+ gap: var(--kv-space-1);
219
+ padding: var(--kv-space-4);
220
+ border: 1px solid var(--kv-panel-border);
221
+ border-radius: var(--kv-radius-md);
222
+ background: var(--kv-panel-bg);
223
+ }
224
+
225
+ /* A metric with a glyph puts it in a tile on the left and lets the figure keep
226
+ the rest of the row, so a grid of four stays scannable by position. */
227
+ :where([data-kv-design-system]) [data-ui="metric"]:has(> [data-ui="metric-icon"]) {
228
+ grid-template-columns: auto 1fr;
229
+ column-gap: var(--kv-space-3);
230
+ }
231
+
232
+ /* The figures are pinned to the text column: auto-placement would wrap them
233
+ back under the tile as soon as a card carried a third line. */
234
+ :where([data-kv-design-system])
235
+ [data-ui="metric"]:has(> [data-ui="metric-icon"])
236
+ > :not([data-ui="metric-icon"]) {
237
+ grid-column: 2;
238
+ }
239
+
240
+ :where([data-kv-design-system]) [data-ui="metric-icon"] {
241
+ display: grid;
242
+ grid-row: 1 / 3;
243
+ grid-column: 1;
244
+ align-self: center;
245
+ place-items: center;
246
+ inline-size: 2.25rem;
247
+ block-size: 2.25rem;
248
+ border-radius: var(--kv-radius-md);
249
+ background: var(--kv-accent-subtle);
250
+ color: var(--kv-accent);
251
+ }
252
+
253
+ :where([data-kv-design-system]) [data-ui="metric-icon"] svg {
254
+ inline-size: 1.125rem;
255
+ block-size: 1.125rem;
256
+ }
257
+
258
+ :where([data-kv-design-system]) a[data-ui="metric"] {
259
+ color: inherit;
260
+ text-decoration: none;
261
+ }
262
+
263
+ :where([data-kv-design-system]) a[data-ui="metric"]:hover {
264
+ border-color: var(--kv-color-line-strong);
265
+ background: var(--kv-color-surface-hover);
266
+ }
267
+
268
+ :where([data-kv-design-system]) [data-ui="metric-label"] {
269
+ display: flex;
270
+ align-items: center;
271
+ margin-bottom: 0;
272
+ gap: var(--kv-space-2);
273
+ color: var(--kv-text-secondary);
274
+ font-size: var(--kv-text-xs);
275
+ font-weight: var(--kv-weight-semibold);
276
+ letter-spacing: 0.05em;
277
+ text-transform: uppercase;
278
+ }
279
+
280
+ /* Drawn only for a metric that was given a tone. A grey bullet in front of
281
+ every label would be decoration; here it is the one place a KPI row carries
282
+ state, which is why the figure beside it stays in the page's ink. */
283
+ :where([data-kv-design-system]) [data-ui="metric"][data-dot="true"] [data-ui="metric-label"]::before {
284
+ width: 0.5rem;
285
+ height: 0.5rem;
286
+ flex: none;
287
+ border-radius: 50%;
288
+ background: var(--kv-text-muted);
289
+ content: "";
290
+ }
291
+
292
+ :where([data-kv-design-system]) [data-ui="metric"][data-tone="info"] [data-ui="metric-label"]::before {
293
+ background: var(--kv-color-info);
294
+ }
295
+
296
+ :where([data-kv-design-system]) [data-ui="metric"][data-tone="positive"] [data-ui="metric-label"]::before {
297
+ background: var(--kv-color-positive);
298
+ }
299
+
300
+ :where([data-kv-design-system]) [data-ui="metric"][data-tone="warning"] [data-ui="metric-label"]::before {
301
+ background: var(--kv-color-warning);
302
+ }
303
+
304
+ :where([data-kv-design-system]) [data-ui="metric"][data-tone="danger"] [data-ui="metric-label"]::before {
305
+ background: var(--kv-color-danger);
306
+ }
307
+
308
+ :where([data-kv-design-system]) [data-ui="metric-value"] {
309
+ margin-bottom: 0;
310
+ font-size: var(--kv-text-2xl);
311
+ font-weight: var(--kv-weight-bold);
312
+ font-variant-numeric: tabular-nums;
313
+ letter-spacing: -0.025em;
314
+ }
315
+
316
+ :where([data-kv-design-system]) [data-ui="metric-detail"] {
317
+ margin: 0;
318
+ color: var(--kv-text-secondary);
319
+ font-size: var(--kv-text-sm);
320
+ }
321
+
322
+ @media (max-width: 48rem) {
323
+ :where([data-kv-design-system]) [data-ui="grid"] {
324
+ grid-template-columns: 1fr;
325
+ }
326
+
327
+ :where([data-kv-design-system]) [data-ui="section-head"] {
328
+ align-items: start;
329
+ flex-direction: column;
330
+ }
331
+ }
332
+ }
@@ -0,0 +1,154 @@
1
+ @layer ket.app {
2
+ :where([data-kv-design-system]) [data-ui="app-shell"] {
3
+ display: grid;
4
+ min-width: 0;
5
+ min-height: 100dvh;
6
+ grid-template-columns: var(--kv-sidebar-width) minmax(0, 1fr);
7
+ background: var(--kv-page-bg);
8
+ color: var(--kv-text-main);
9
+ }
10
+
11
+ :where([data-kv-design-system]) [data-ui="app-shell"][data-has-right-rail="true"] {
12
+ grid-template-columns: var(--kv-sidebar-width) minmax(0, 1fr) var(--kv-right-rail-width);
13
+ }
14
+
15
+ :where([data-kv-design-system]) [data-ui="app-sidebar"] {
16
+ position: sticky;
17
+ top: 0;
18
+ height: 100dvh;
19
+ min-width: 0;
20
+ overflow: hidden;
21
+ border-right: 1px solid var(--kv-sidebar-border);
22
+ border-radius: var(--kv-radius-app-region);
23
+ background: var(--kv-sidebar-bg);
24
+ }
25
+
26
+ :where([data-kv-design-system]) [data-ui="app-main"] {
27
+ min-width: 0;
28
+ border-radius: var(--kv-radius-app-region);
29
+ background: var(--kv-page-bg);
30
+ }
31
+
32
+ :where([data-kv-design-system]) [data-ui="app-right-rail"] {
33
+ position: sticky;
34
+ top: 0;
35
+ height: 100dvh;
36
+ min-width: 0;
37
+ overflow-y: auto;
38
+ border-left: 1px solid var(--kv-right-rail-border);
39
+ border-radius: var(--kv-radius-app-region);
40
+ background: var(--kv-right-rail-bg);
41
+ }
42
+
43
+ :where([data-kv-design-system]) [data-ui="app-shell"][data-mode="embedded"] {
44
+ min-height: 28rem;
45
+ height: 28rem;
46
+ overflow: hidden;
47
+ }
48
+
49
+ :where([data-kv-design-system])
50
+ [data-ui="app-shell"][data-mode="embedded"]
51
+ :is([data-ui="app-sidebar"], [data-ui="app-right-rail"]) {
52
+ position: relative;
53
+ height: 100%;
54
+ }
55
+
56
+ :where([data-kv-design-system]) [data-ui="page"] {
57
+ min-width: 0;
58
+ padding: var(--kv-page-padding-y) var(--kv-page-padding-x);
59
+ }
60
+
61
+ :where([data-kv-design-system]) [data-ui="page-header"] {
62
+ display: flex;
63
+ align-items: flex-start;
64
+ justify-content: space-between;
65
+ gap: var(--kv-space-6);
66
+ margin-bottom: var(--kv-space-6);
67
+ }
68
+
69
+ :where([data-kv-design-system]) [data-ui="page-heading"] {
70
+ min-width: 0;
71
+ }
72
+
73
+ :where([data-kv-design-system]) [data-ui="page-title"] {
74
+ margin: 0;
75
+ font-size: var(--kv-text-2xl);
76
+ font-weight: var(--kv-weight-semibold);
77
+ letter-spacing: -0.025em;
78
+ line-height: var(--kv-leading-tight);
79
+ }
80
+
81
+ :where([data-kv-design-system]) [data-ui="page-description"] {
82
+ margin: var(--kv-space-1-5) 0 0;
83
+ color: var(--kv-text-muted);
84
+ font-size: var(--kv-text-sm);
85
+ }
86
+
87
+ :where([data-kv-design-system]) [data-ui="page-actions"] {
88
+ flex: 0 0 auto;
89
+ }
90
+
91
+ :where([data-kv-design-system]) [data-ui="page-body"] {
92
+ min-width: 0;
93
+ }
94
+
95
+ :where([data-kv-design-system]) [data-ui="record-canvas"] {
96
+ min-width: 0;
97
+ padding: 1.375rem var(--kv-page-padding-x) var(--kv-space-12);
98
+ }
99
+
100
+ :where([data-kv-design-system]) [data-ui="record-content"] {
101
+ width: 100%;
102
+ min-width: 0;
103
+ }
104
+
105
+ :where([data-kv-design-system]) [data-ui="record-section"] {
106
+ min-width: 0;
107
+ padding: var(--kv-space-6) 0;
108
+ border-bottom: 1px solid var(--kv-panel-divider);
109
+ }
110
+
111
+ :where([data-kv-design-system]) [data-ui="record-section"]:last-child {
112
+ border-bottom: 0;
113
+ }
114
+
115
+ :where([data-kv-design-system]) [data-ui="record-section-title"] {
116
+ margin: 0 0 var(--kv-space-4);
117
+ font-size: var(--kv-text-lg);
118
+ font-weight: var(--kv-weight-semibold);
119
+ }
120
+
121
+ @media (max-width: 48rem) {
122
+ :where([data-kv-design-system]) [data-ui="app-shell"],
123
+ :where([data-kv-design-system]) [data-ui="app-shell"][data-has-right-rail="true"] {
124
+ grid-template-columns: minmax(0, 1fr);
125
+ }
126
+
127
+ :where([data-kv-design-system]) [data-ui="app-sidebar"],
128
+ :where([data-kv-design-system]) [data-ui="app-right-rail"] {
129
+ position: relative;
130
+ width: auto;
131
+ height: auto;
132
+ }
133
+
134
+ :where([data-kv-design-system]) [data-ui="app-sidebar"] {
135
+ border-right: 0;
136
+ border-bottom: 1px solid var(--kv-sidebar-border);
137
+ }
138
+
139
+ :where([data-kv-design-system]) [data-ui="app-right-rail"] {
140
+ border-top: 1px solid var(--kv-right-rail-border);
141
+ border-left: 0;
142
+ }
143
+
144
+ :where([data-kv-design-system]) [data-ui="page"],
145
+ :where([data-kv-design-system]) [data-ui="record-canvas"] {
146
+ padding-inline: var(--kv-space-4);
147
+ }
148
+
149
+ :where([data-kv-design-system]) [data-ui="page-header"] {
150
+ flex-direction: column;
151
+ gap: var(--kv-space-4);
152
+ }
153
+ }
154
+ }
@@ -0,0 +1,27 @@
1
+ import type { JSXChild, TemplateResult } from '@ketvietlab/ketjs-view';
2
+ export declare const HOOKS: readonly ['app-shell', 'app-sidebar', 'app-main', 'app-right-rail', 'page', 'page-header', 'page-heading', 'page-title', 'page-description', 'page-actions', 'page-body', 'record-canvas', 'record-content', 'record-section', 'record-section-title'];
3
+ export declare const AppShell: (props: {
4
+ sidebar: JSXChild;
5
+ main: JSXChild;
6
+ rightRail?: JSXChild;
7
+ mode?: 'viewport' | 'embedded';
8
+ }) => TemplateResult;
9
+ export declare const PageHeader: (props: {
10
+ title: string;
11
+ description?: string | null;
12
+ actions?: JSXChild;
13
+ }) => TemplateResult;
14
+ export declare const Page: (props: {
15
+ title: string;
16
+ body: JSXChild;
17
+ description?: string | null;
18
+ actions?: JSXChild;
19
+ }) => TemplateResult;
20
+ export declare const RecordCanvas: (props: {
21
+ body: JSXChild;
22
+ }) => TemplateResult;
23
+ export declare const RecordSection: (props: {
24
+ body: JSXChild;
25
+ title?: string | null;
26
+ }) => TemplateResult;
27
+ //# sourceMappingURL=shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../../../../packages/design-system/src/layouts/shell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAEtE,eAAO,MAAM,KAAK,YAChB,WAAW,EACX,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,MAAM,EACN,aAAa,EACb,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,cAAc,EACd,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,sBAAsB,CACd,CAAA;AAEV,eAAO,MAAM,QAAQ,UAAW;IAC9B,OAAO,EAAE,QAAQ,CAAA;IACjB,IAAI,EAAE,QAAQ,CAAA;IACd,SAAS,CAAC,EAAE,QAAQ,CAAA;IACpB,IAAI,CAAC,EAAE,UAAU,GAAG,UAAU,CAAA;CAC/B,KAAG,cAUH,CAAA;AAED,eAAO,MAAM,UAAU,UAAW;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,OAAO,CAAC,EAAE,QAAQ,CAAA;CACnB,KAAG,cAQH,CAAA;AAED,eAAO,MAAM,IAAI,UAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,QAAQ,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,OAAO,CAAC,EAAE,QAAQ,CAAA;CACnB,KAAG,cAKH,CAAA;AAED,eAAO,MAAM,YAAY,UAAW;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,KAAG,cAIxD,CAAA;AAED,eAAO,MAAM,aAAa,UAAW;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,KAAG,cAKhF,CAAA"}