jsl-ui 9.28.7 → 10.0.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.
- package/docs/AutoSuggestComponent.md +17 -0
- package/docs/ButtonComponent.md +14 -0
- package/docs/CheckBoxComponent.md +12 -0
- package/docs/DateComponent.md +12 -0
- package/docs/DateRangeComponent.md +13 -0
- package/docs/DateTimeComponent.md +13 -0
- package/docs/DialogComponent.md +15 -0
- package/docs/ExpanderComponent.md +13 -0
- package/docs/FormComponent.md +15 -0
- package/docs/FormFieldComponent.md +15 -0
- package/docs/GridComponent.md +19 -0
- package/docs/InputComponent.md +15 -0
- package/docs/IntervalComponent.md +13 -0
- package/docs/LoadingComponent.md +12 -0
- package/docs/NavigationComponent.md +17 -0
- package/docs/Notification.md +14 -0
- package/docs/NotificationComponent.md +13 -0
- package/docs/NumberComponent.md +12 -0
- package/docs/OverlayComponent.md +12 -0
- package/docs/ProgressComponent.md +12 -0
- package/docs/README.md +24 -0
- package/docs/RibbonMenuComponent.md +14 -0
- package/docs/SelectComponent.md +15 -0
- package/docs/SplitterComponent.md +14 -0
- package/docs/StackPanelComponent.md +13 -0
- package/docs/TabsComponent.md +16 -0
- package/docs/TimeComponent.md +13 -0
- package/docs/TreeViewComponent.md +16 -0
- package/examples/showcase/checks-and-expanders.ts +163 -0
- package/examples/showcase/cultures.ts +39 -0
- package/examples/showcase/dates.ts +182 -0
- package/examples/showcase/dialogs.ts +184 -0
- package/examples/showcase/feedback-and-navigation.ts +174 -0
- package/examples/showcase/fields.ts +178 -0
- package/examples/showcase/fonts/Jost-Variable.ttf +0 -0
- package/examples/showcase/fonts/OFL-Jost.txt +93 -0
- package/examples/showcase/grids.ts +150 -0
- package/examples/showcase/index.html +60 -0
- package/examples/showcase/layout-and-navigation.ts +47 -0
- package/examples/showcase/nivona.css +98 -0
- package/examples/showcase/selects.ts +158 -0
- package/examples/showcase/showcase.css +231 -0
- package/examples/showcase/showcase.ts +214 -0
- package/examples/showcase/tabs.ts +161 -0
- package/examples/showcase/themes.css +83 -0
- package/examples/showcase/themes.ts +54 -0
- package/lib/components/IntervalComponent.d.ts +5 -0
- package/lib/components/IntervalComponent.js +29 -13
- package/lib/components/auto-suggest/AutoSuggestComponent.d.ts +11 -9
- package/lib/components/auto-suggest/AutoSuggestComponent.js +25 -38
- package/lib/components/button/ButtonComponent.d.ts +30 -1
- package/lib/components/button/ButtonComponent.js +85 -4
- package/lib/components/checkbox/CheckBoxComponent.d.ts +11 -1
- package/lib/components/checkbox/CheckBoxComponent.js +66 -56
- package/lib/components/checkbox/CheckBoxStyle.scss +72 -85
- package/lib/components/date/DateComponent.d.ts +10 -0
- package/lib/components/date/DateComponent.js +92 -44
- package/lib/components/date-range/DateRangeComponent.d.ts +14 -3
- package/lib/components/date-range/DateRangeComponent.js +96 -86
- package/lib/components/date-range/DateRangeStyle.scss +35 -11
- package/lib/components/date-time/DateTimeComponent.d.ts +8 -0
- package/lib/components/date-time/DateTimeComponent.js +64 -23
- package/lib/components/date-time/DateTimeStyle.scss +10 -7
- package/lib/components/dialog/DialogComponent.d.ts +21 -7
- package/lib/components/dialog/DialogComponent.js +179 -122
- package/lib/components/expander/ExpanderComponent.d.ts +15 -1
- package/lib/components/expander/ExpanderComponent.js +85 -64
- package/lib/components/expander/ExpanderStyle.scss +61 -47
- package/lib/components/form-field/FormFieldComponent.d.ts +45 -15
- package/lib/components/form-field/FormFieldComponent.js +249 -96
- package/lib/components/form-field/FormFieldStyle.scss +36 -87
- package/lib/components/form-field/create-control.d.ts +7 -0
- package/lib/components/form-field/create-control.js +48 -0
- package/lib/components/input/InputComponent.d.ts +18 -1
- package/lib/components/input/InputComponent.js +68 -93
- package/lib/components/loading/LoadingComponent.d.ts +9 -2
- package/lib/components/loading/LoadingComponent.js +13 -12
- package/lib/components/loading/LoadingStyle.css +19 -29
- package/lib/components/navigation/NavigationComponent.d.ts +34 -10
- package/lib/components/navigation/NavigationComponent.js +261 -33
- package/lib/components/navigation/NavigationStyle.scss +62 -226
- package/lib/components/notification/Notification.d.ts +37 -4
- package/lib/components/notification/Notification.js +160 -41
- package/lib/components/notification/Notification.scss +103 -19
- package/lib/components/number/NumberComponent.d.ts +16 -2
- package/lib/components/number/NumberComponent.js +54 -53
- package/lib/components/overlay/OverlayComponent.d.ts +13 -7
- package/lib/components/overlay/OverlayComponent.js +46 -114
- package/lib/components/overlay/overlay.css +18 -57
- package/lib/components/progress/ProgressComponent.d.ts +1 -0
- package/lib/components/progress/ProgressComponent.js +6 -6
- package/lib/components/progress/ProgressStyle.scss +5 -15
- package/lib/components/ribbon-menu/RibbonMenuComponent.js +2 -2
- package/lib/components/ribbon-menu/RibbonMenuStyle.scss +6 -76
- package/lib/components/select/SelectComponent.d.ts +33 -3
- package/lib/components/select/SelectComponent.js +312 -278
- package/lib/components/select/SelectDDAreaComponent.d.ts +13 -7
- package/lib/components/select/SelectDDAreaComponent.js +215 -256
- package/lib/components/select/SelectStyle.scss +204 -186
- package/lib/components/slider/nouislider.css +40 -54
- package/lib/components/stack-panel/SplitterComponent.d.ts +19 -3
- package/lib/components/stack-panel/SplitterComponent.js +94 -111
- package/lib/components/stack-panel/SplitterStyle.scss +9 -45
- package/lib/components/stack-panel/StackPanelComponent.js +3 -3
- package/lib/components/stack-panel/StackPanelStyle.scss +10 -52
- package/lib/components/tabs/TabsComponent.d.ts +17 -1
- package/lib/components/tabs/TabsComponent.js +247 -123
- package/lib/components/tabs/TabsStyle.scss +138 -75
- package/lib/components/time/TimeComponent.d.ts +5 -0
- package/lib/components/time/TimeComponent.js +61 -69
- package/lib/components/time/TimeComponent.scss +4 -4
- package/lib/components/tree-view/TreeViewComponent.d.ts +10 -4
- package/lib/components/tree-view/TreeViewComponent.js +65 -32
- package/lib/components/tree-view/TreeViewStyle.scss +12 -96
- package/lib/core/date.d.ts +2 -0
- package/lib/core/date.js +6 -0
- package/lib/core/jq.js +11 -8
- package/lib/grid/slick-default-theme.css +107 -31
- package/lib/grid/slick.creator.js +23 -5
- package/lib/grid/slick.formatters.js +4 -3
- package/lib/grid/slick.grid.css +38 -26
- package/lib/grid/slick.grid.d.ts +1 -0
- package/lib/grid/slick.grid.js +2 -3
- package/lib/grid.css +3413 -454
- package/lib/index.css +2500 -1031
- package/lib/index.css.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/interaction/moveable.d.ts +1 -0
- package/lib/interaction/moveable.js +8 -0
- package/lib/interaction/resizable.d.ts +1 -0
- package/lib/interaction/resizable.js +9 -0
- package/lib/ui/auto.suggest.css +31 -14
- package/lib/ui/auto.suggest.d.ts +1 -0
- package/lib/ui/auto.suggest.js +88 -18
- package/lib/ui/base.css +2 -48
- package/lib/ui/button.css +134 -0
- package/lib/ui/date-input.css +11 -0
- package/lib/ui/date.picker/css/tiny-date-picker.css +124 -325
- package/lib/ui/date.picker/date-picker-options.js +4 -3
- package/lib/ui/date.picker/lib/date-manip.js +9 -0
- package/lib/ui/date.picker/mode/base-mode.d.ts +2 -1
- package/lib/ui/date.picker/mode/base-mode.js +112 -22
- package/lib/ui/date.picker/mode/dropdown-mode.d.ts +2 -4
- package/lib/ui/date.picker/mode/dropdown-mode.js +29 -42
- package/lib/ui/date.picker/mode/index.d.ts +2 -1
- package/lib/ui/date.picker/mode/modal-mode.d.ts +2 -1
- package/lib/ui/date.picker/mode/modal-mode.js +4 -2
- package/lib/ui/date.picker/mode/permanent-mode.d.ts +2 -1
- package/lib/ui/date.picker/views/day-picker.js +24 -15
- package/lib/ui/date.picker/views/month-picker.js +1 -1
- package/lib/ui/date.picker/views/year-picker.js +3 -2
- package/lib/ui/date.picker.d.ts +2 -1
- package/lib/ui/dialog.css +144 -108
- package/lib/ui/dialog.d.ts +19 -1
- package/lib/ui/dialog.js +178 -60
- package/lib/ui/input.css +35 -0
- package/lib/ui/number.input.js +50 -37
- package/lib/ui/theme.css +28 -0
- package/package.json +12 -8
- package/lib/components/drop-down/DropDownComponent.d.ts +0 -27
- package/lib/components/drop-down/DropDownComponent.js +0 -60
- package/lib/components/expander/OldExpanderStyle.scss +0 -37
- package/lib/ui/drop.down.d.ts +0 -52
- package/lib/ui/drop.down.js +0 -2112
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/* NIVONA Retailer Brandbook, April 2026, v1.0; printed pages 14–21.
|
|
2
|
+
Use the specified HEX values (the RGB/print swatches differ slightly).
|
|
3
|
+
Light Beige is the foundation, Grey is functional text, and Red is restrained
|
|
4
|
+
interaction color. Hover, border, and disabled tones are UI derivatives.
|
|
5
|
+
This theme belongs to the showcase; the library's neutral defaults stay shared. */
|
|
6
|
+
@font-face {
|
|
7
|
+
font-family: "Jost";
|
|
8
|
+
src: url("./fonts/Jost-Variable.ttf") format("truetype");
|
|
9
|
+
font-style: normal;
|
|
10
|
+
font-weight: 100 900;
|
|
11
|
+
font-display: swap;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
:root[data-showcase-theme="nivona"] {
|
|
15
|
+
color-scheme: light;
|
|
16
|
+
font-family: "Jost", "Segoe UI", sans-serif;
|
|
17
|
+
|
|
18
|
+
--nivona-red: #e4032d;
|
|
19
|
+
--nivona-aubergine: #3d2a55;
|
|
20
|
+
--nivona-dark-blue: #15022d;
|
|
21
|
+
--nivona-grey: #3c3c3b;
|
|
22
|
+
--nivona-beige: #cdb1a3;
|
|
23
|
+
--nivona-light-beige: #f4efed;
|
|
24
|
+
|
|
25
|
+
--jsl-color-canvas: var(--nivona-light-beige);
|
|
26
|
+
--jsl-color-surface: #ffffff;
|
|
27
|
+
--jsl-color-surface-subtle: var(--nivona-light-beige);
|
|
28
|
+
--jsl-color-surface-hover: #eee4df;
|
|
29
|
+
--jsl-color-surface-selected: #e8d8cf;
|
|
30
|
+
--jsl-color-border: #a48d81;
|
|
31
|
+
--jsl-color-border-subtle: #dfd2cc;
|
|
32
|
+
--jsl-color-text: var(--nivona-grey);
|
|
33
|
+
--jsl-color-text-secondary: #5e504b;
|
|
34
|
+
--jsl-color-text-muted: #75665f;
|
|
35
|
+
--jsl-color-accent: var(--nivona-red);
|
|
36
|
+
--jsl-color-accent-hover: #c00327;
|
|
37
|
+
--jsl-color-accent-active: #a00321;
|
|
38
|
+
--jsl-color-on-accent: #ffffff;
|
|
39
|
+
--jsl-color-focus: var(--nivona-aubergine);
|
|
40
|
+
--jsl-color-disabled-surface: #eee6e2;
|
|
41
|
+
--jsl-color-disabled-text: #75665f;
|
|
42
|
+
--jsl-color-overlay: rgba(21, 2, 45, 0.48);
|
|
43
|
+
--jsl-shadow-dialog: 0 24px 64px rgba(21, 2, 45, 0.18), 0 4px 16px rgba(21, 2, 45, 0.08);
|
|
44
|
+
--jsl-button-radius: 0.25rem;
|
|
45
|
+
--jsl-dialog-radius: 0.375rem;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* Ethos is proprietary and is not distributed here. Use an installed licensed
|
|
49
|
+
copy when available; Georgia preserves the brand's serif headline hierarchy. */
|
|
50
|
+
:root[data-showcase-theme="nivona"] :is(h1, h2, h3, h4) {
|
|
51
|
+
font-family: "Ethos", Georgia, "Times New Roman", serif;
|
|
52
|
+
color: var(--nivona-dark-blue);
|
|
53
|
+
font-weight: 500;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
:root[data-showcase-theme="nivona"] .sidebar {
|
|
57
|
+
/* Local tokens keep navigation text and interaction states readable. */
|
|
58
|
+
--jsl-color-surface: var(--nivona-dark-blue);
|
|
59
|
+
--jsl-color-text: var(--nivona-light-beige);
|
|
60
|
+
--jsl-color-text-secondary: #e3d5ce;
|
|
61
|
+
--jsl-color-text-muted: var(--nivona-beige);
|
|
62
|
+
--jsl-color-surface-hover: #29183d;
|
|
63
|
+
--jsl-color-surface-selected: var(--nivona-aubergine);
|
|
64
|
+
--jsl-color-border-subtle: #4e3e60;
|
|
65
|
+
--jsl-color-focus: var(--nivona-beige);
|
|
66
|
+
color: var(--jsl-color-text);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
:root[data-showcase-theme="nivona"] .brand-mark {
|
|
70
|
+
background: var(--nivona-light-beige);
|
|
71
|
+
color: var(--nivona-dark-blue);
|
|
72
|
+
border-radius: 4px;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
:root[data-showcase-theme="nivona"] .nav-item[aria-current] {
|
|
76
|
+
box-shadow: inset 2px 0 var(--nivona-red);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
:root[data-showcase-theme="nivona"] .eyebrow {
|
|
80
|
+
color: var(--nivona-red);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
:root[data-showcase-theme="nivona"] :is(.sample-card, .usage, .context-panel) {
|
|
84
|
+
border-radius: 6px;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
:root[data-showcase-theme="nivona"] .sample-number {
|
|
88
|
+
color: var(--nivona-aubergine);
|
|
89
|
+
border-color: var(--nivona-beige);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
:root[data-showcase-theme="nivona"] .status-dot {
|
|
93
|
+
background: var(--jsl-color-success);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
:root[data-showcase-theme="nivona"] .sidebar .status-dot {
|
|
97
|
+
background: var(--nivona-beige);
|
|
98
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { IJSLComponent, IJSLVNode } from "jsl-render";
|
|
2
|
+
import { SelectComponent } from "../../components/select/SelectComponent";
|
|
3
|
+
import { ButtonComponent } from "../../components/button/ButtonComponent";
|
|
4
|
+
import { DialogComponent } from "../../components/dialog/DialogComponent";
|
|
5
|
+
|
|
6
|
+
type Content = IJSLVNode | IJSLComponent;
|
|
7
|
+
const text = (tag: string, content: string, className?: string): IJSLVNode => ({ tag, content, attr: { class: className } });
|
|
8
|
+
const group = (children: Content[], className?: string): IJSLVNode => ({ tag: "div", attr: { class: className }, children });
|
|
9
|
+
const status = (content: string): IJSLVNode => ({ tag: "p", content, attr: { class: "sample-status", role: "status" } });
|
|
10
|
+
const field = (id: string, label: string, control: Content) => group([
|
|
11
|
+
{ tag: "label", content: label, attr: { for: id } }, control
|
|
12
|
+
], "select-showcase-field");
|
|
13
|
+
const action = (content: string, click: () => void) => new ButtonComponent({ content, click, type: "button", outlined: true, size: "small" });
|
|
14
|
+
const projects = [
|
|
15
|
+
{ value: "website", text: "Website refresh" }, { value: "library", text: "Component library" },
|
|
16
|
+
{ value: "workspace", text: "Team workspace" }, { value: "mobile", text: "Mobile experience" },
|
|
17
|
+
{ value: "research", text: "Customer research" }, { value: "release", text: "Autumn release" }
|
|
18
|
+
];
|
|
19
|
+
const skills = [
|
|
20
|
+
{ value: "design", text: "Design" }, { value: "typescript", text: "TypeScript" },
|
|
21
|
+
{ value: "accessibility", text: "Accessibility" }, { value: "testing", text: "Testing" },
|
|
22
|
+
{ value: "research", text: "Research" }, { value: "documentation", text: "Documentation" }
|
|
23
|
+
];
|
|
24
|
+
const singleStatus = status("No project selected.");
|
|
25
|
+
const single = new SelectComponent({
|
|
26
|
+
id: "select-project", data: projects, placeholder: "Choose a project", ariaLabel: "Project",
|
|
27
|
+
onChange: (value, item) => { singleStatus.content = item ? "Selected: " + item.text + " (" + value + ")" : "Selection cleared."; }
|
|
28
|
+
});
|
|
29
|
+
const multiStatus = status("2 skills selected.");
|
|
30
|
+
const multi = new SelectComponent({
|
|
31
|
+
id: "select-skills", data: skills, multiple: true, value: ["design", "typescript"],
|
|
32
|
+
placeholder: "Add skills", ariaLabel: "Skills",
|
|
33
|
+
onChange: (values, items) => {
|
|
34
|
+
const names = (items as unknown as typeof skills).map(item => item.text);
|
|
35
|
+
multiStatus.content = values.length ? values.length + " selected: " + names.join(", ") : "No skills selected.";
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
const locations = [
|
|
39
|
+
{ value: "vienna", text: "Vienna", region: "Europe" }, { value: "berlin", text: "Berlin", region: "Europe" },
|
|
40
|
+
{ value: "copenhagen", text: "Copenhagen", region: "Europe" }, { value: "tokyo", text: "Tokyo", region: "Asia Pacific" },
|
|
41
|
+
{ value: "singapore", text: "Singapore", region: "Asia Pacific" }, { value: "sydney", text: "Sydney", region: "Asia Pacific" },
|
|
42
|
+
{ value: "new-york", text: "New York", region: "Americas" }, { value: "toronto", text: "Toronto", region: "Americas" }
|
|
43
|
+
];
|
|
44
|
+
const groupStatus = status("Choose one or more offices.");
|
|
45
|
+
const people = [
|
|
46
|
+
{ value: "maya", text: "Maya Chen", initials: "MC", role: "Product designer" },
|
|
47
|
+
{ value: "alex", text: "Alex Morgan", initials: "AM", role: "Frontend engineer" },
|
|
48
|
+
{ value: "sam", text: "Sam Rivera", initials: "SR", role: "Accessibility specialist" },
|
|
49
|
+
{ value: "jules", text: "Jules Martin", initials: "JM", role: "Product manager" }
|
|
50
|
+
];
|
|
51
|
+
const memberModel = { owner: "maya" };
|
|
52
|
+
const memberStatus = status("Model value: maya");
|
|
53
|
+
const member = new SelectComponent({
|
|
54
|
+
id: "select-owner", data: people, bindTo: memberModel, property: "owner", bindMode: "both",
|
|
55
|
+
ariaLabel: "Project owner", placeholder: "Assign an owner", rowHeight: 56,
|
|
56
|
+
matchSearch: (item, term) => (item.text + " " + item.role).toLowerCase().includes(term.toLowerCase()),
|
|
57
|
+
onRender: args => args.isCurrent ? text("span", args.data.text) : group([
|
|
58
|
+
{ tag: "span", content: args.data.initials, attr: { class: "select-person-avatar", "aria-hidden": "true" } },
|
|
59
|
+
group([text("strong", args.data.text), text("span", args.data.role)], "select-person-copy")
|
|
60
|
+
], "select-person"),
|
|
61
|
+
onChange: () => { memberStatus.content = "Model value: " + (memberModel.owner ?? "empty"); }
|
|
62
|
+
});
|
|
63
|
+
const largeStatus = status("Search by name or jump through the list with your keyboard.");
|
|
64
|
+
const large = new SelectComponent({
|
|
65
|
+
id: "select-large", data: Array.from({ length: 10000 }, (_, i) => ({ value: i + 1, text: "Item " + ("00000" + (i + 1)).slice(-5) })),
|
|
66
|
+
value: 5000, ariaLabel: "Large list", dropdownHeight: "18rem", placeholder: "Choose an item",
|
|
67
|
+
onChange: (value, item) => { largeStatus.content = item ? "Selected " + item.text + ", key " + value : "Selection cleared."; }
|
|
68
|
+
});
|
|
69
|
+
function card(id: string, number: string, title: string, description: string, children: Content[]): IJSLVNode {
|
|
70
|
+
return { tag: "article", attr: { id, class: "sample-card" }, children: [
|
|
71
|
+
group([text("span", number, "sample-number"), text("h3", title)], "card-heading"),
|
|
72
|
+
text("p", description, "card-description"), ...children
|
|
73
|
+
] };
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export const selectShowcase: IJSLVNode = {
|
|
77
|
+
tag: "section", attr: { id: "selects", class: "component-section", "aria-labelledby": "selects-title" }, children: [
|
|
78
|
+
group([
|
|
79
|
+
group([
|
|
80
|
+
text("p", "THE ESSENTIALS / 08", "eyebrow"),
|
|
81
|
+
{ tag: "h2", content: "Selects", attr: { id: "selects-title", class: "section-title" } },
|
|
82
|
+
text("p", "One choice or a few. Search, select, and keep the options easy to scan.", "hero-description")
|
|
83
|
+
], "hero-copy"),
|
|
84
|
+
group([
|
|
85
|
+
text("span", "INTERACTIVE PREVIEW", "preview-caption"),
|
|
86
|
+
field("select-preview-single", "Project", new SelectComponent({
|
|
87
|
+
id: "select-preview-single", data: projects, value: "library", ariaLabel: "Preview project"
|
|
88
|
+
})),
|
|
89
|
+
field("select-preview-multi", "Skills", new SelectComponent({
|
|
90
|
+
id: "select-preview-multi", data: skills, multiple: true, value: ["design", "typescript"], ariaLabel: "Preview skills"
|
|
91
|
+
}))
|
|
92
|
+
], "hero-preview select-hero-preview")
|
|
93
|
+
], "hero"),
|
|
94
|
+
group([
|
|
95
|
+
text("span", "Overview", "overview-label"), text("span", "Single & multiple", "overview-stat"),
|
|
96
|
+
text("span", "Search & groups", "overview-stat"), text("span", "Keyboard accessible", "overview-stat")
|
|
97
|
+
], "overview-bar"),
|
|
98
|
+
group([
|
|
99
|
+
card("select-single", "01", "A single choice", "A searchable list with a clear selection. Choose a project, then clear it to start again.", [
|
|
100
|
+
field("select-project", "Project", single), singleStatus,
|
|
101
|
+
text("pre", '{ data: projects, placeholder: "Choose a project" }', "sample-code")
|
|
102
|
+
]),
|
|
103
|
+
card("select-multiple", "02", "A collection of choices", "Selected items become compact chips. Toggle checked options while keeping the list open.", [
|
|
104
|
+
field("select-skills", "Skills", multi), multiStatus,
|
|
105
|
+
text("p", "Enter toggles the focused option. Escape finishes and returns focus to the field.", "inline-note"),
|
|
106
|
+
text("pre", '{ multiple: true, value: ["design", "typescript"] }', "sample-code")
|
|
107
|
+
]),
|
|
108
|
+
card("select-grouped", "03", "Options with context", "Group related options. Search filters the items and preserves their headings.", [
|
|
109
|
+
field("select-offices", "Offices", new SelectComponent({
|
|
110
|
+
id: "select-offices", data: locations, groupProperty: "region", multiple: true,
|
|
111
|
+
ariaLabel: "Offices", placeholder: "Choose offices",
|
|
112
|
+
onChange: values => { groupStatus.content = values.length ? values.length + " offices selected." : "Choose one or more offices."; }
|
|
113
|
+
})), groupStatus,
|
|
114
|
+
action("Try inside a dialog", () => {
|
|
115
|
+
DialogComponent.show({
|
|
116
|
+
header: "Choose a project", width: "28rem",
|
|
117
|
+
content: group([
|
|
118
|
+
text("p", "Select a project. Escape closes the options first.", "card-description"),
|
|
119
|
+
field("select-dialog-project", "Project", new SelectComponent({
|
|
120
|
+
id: "select-dialog-project", data: projects, ariaLabel: "Dialog project", placeholder: "Choose a project"
|
|
121
|
+
}))
|
|
122
|
+
]),
|
|
123
|
+
footer: group([DialogComponent.Cancel(), DialogComponent.Ok()], "sample-row")
|
|
124
|
+
});
|
|
125
|
+
})
|
|
126
|
+
]),
|
|
127
|
+
card("select-custom", "04", "More than a label", "Custom rows add useful details. This field also reads and writes a bound model.", [
|
|
128
|
+
field("select-owner", "Project owner", member), memberStatus,
|
|
129
|
+
action("Assign Alex from the model", () => { memberModel.owner = "alex"; memberStatus.content = "Model value: alex"; }),
|
|
130
|
+
text("p", "Search also matches each person's role.", "inline-note")
|
|
131
|
+
]),
|
|
132
|
+
card("select-states", "05", "The right level of choice", "Search can be omitted for short lists. Required selections and disabled controls share the same design.", [
|
|
133
|
+
field("select-required", "Default project", new SelectComponent({
|
|
134
|
+
id: "select-required", data: projects.slice(0, 3), value: "library", ariaLabel: "Default project",
|
|
135
|
+
enableSearch: false, allowEmpty: false
|
|
136
|
+
})),
|
|
137
|
+
field("select-disabled", "Unavailable project", new SelectComponent({
|
|
138
|
+
id: "select-disabled", data: projects, value: "website", enabled: false, ariaLabel: "Unavailable project"
|
|
139
|
+
})),
|
|
140
|
+
field("select-disabled-multi", "Unavailable skills", new SelectComponent({
|
|
141
|
+
id: "select-disabled-multi", data: skills, multiple: true, value: ["design", "testing"], enabled: false, ariaLabel: "Unavailable skills"
|
|
142
|
+
}))
|
|
143
|
+
]),
|
|
144
|
+
card("select-scale", "06", "Room for a long list", "Ten thousand options, with only the visible rows rendered. Selection stays in view when you open the list.", [
|
|
145
|
+
field("select-large", "Item", large), largeStatus,
|
|
146
|
+
text("p", "Type to search. Arrow keys move through results; Ctrl+Home and Ctrl+End jump to either end.", "inline-note")
|
|
147
|
+
])
|
|
148
|
+
], "sample-grid select-sample-grid"),
|
|
149
|
+
{ tag: "details", attr: { class: "usage" }, children: [
|
|
150
|
+
text("summary", "Select usage & compatibility"),
|
|
151
|
+
text("pre", 'new SelectComponent({\n data: [{ value: "design", text: "Design" }, { value: "code", text: "Code" }],\n multiple: true,\n value: ["design"],\n placeholder: "Choose skills",\n ariaLabel: "Skills",\n onChange: (keys, items) => console.log(keys, items)\n});', "sample-code"),
|
|
152
|
+
text("p", "Existing data, keyColumn, textColumn, grouping, render callbacks, converters, binding modes, popup sizing, and onAppend options remain available. The original placehoder spelling remains supported; placeholder takes precedence. Optional id, ariaLabel, ariaLabelledBy, searchPlaceholder, emptyText, and clearButtonLabel help label and translate the control."),
|
|
153
|
+
text("p", "getValue() returns a key or an array of keys. getSelected() returns the corresponding item or items. setValue() updates the selection and writable model silently; setSelected() also raises onChange. toggle(), show(), close(), focus(), isExpanded(), and destroy() are retained. Unmounting cleans up the owning popup."),
|
|
154
|
+
text("p", "Arrow Down, Arrow Up, Enter, and Space open the list. Type to search, use arrow keys to navigate, and Enter to select. Multi-select stays open as options are toggled. Escape returns to the field; Tab continues to the next control. In a list without search, Home/End jump to the ends and Space toggles an option. With search, use Ctrl+Home/End."),
|
|
155
|
+
text("p", "The default multi-select display shows up to three chips and a count for additional items. Custom onRender callbacks still receive the full selected array when isCurrent is true. Keep custom row content decorative; selection is handled by the option itself.")
|
|
156
|
+
] }
|
|
157
|
+
]
|
|
158
|
+
};
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
@import "../../ui/theme.css";
|
|
2
|
+
|
|
3
|
+
:root {
|
|
4
|
+
font-family: "Segoe UI", -apple-system, BlinkMacSystemFont, sans-serif;
|
|
5
|
+
color: var(--jsl-color-text);
|
|
6
|
+
background: var(--jsl-color-canvas);
|
|
7
|
+
font-synthesis: none;
|
|
8
|
+
-webkit-font-smoothing: antialiased;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
* { box-sizing: border-box; }
|
|
12
|
+
body { margin: 0; font-size: 14px; line-height: 1.6; }
|
|
13
|
+
a { color: inherit; }
|
|
14
|
+
.skip-link { position: fixed; top: -5rem; left: 1rem; z-index: 5; padding: 0.5rem 1rem; background: var(--jsl-color-surface); }
|
|
15
|
+
.skip-link:focus { top: 1rem; }
|
|
16
|
+
.sidebar { width: 224px; position: fixed; inset: 0 auto 0 0; padding: 32px 20px; background: var(--jsl-color-surface); border-right: 1px solid var(--jsl-color-border-subtle); display: flex; flex-direction: column; }
|
|
17
|
+
.brand { display: flex; align-items: center; gap: 12px; text-decoration: none; font-size: 17px; font-weight: 650; padding: 0 8px; line-height: 1.5; }
|
|
18
|
+
.brand-mark { width: 36px; height: 36px; border-radius: 10px; background: var(--jsl-color-accent); color: var(--jsl-color-on-accent); font-size: 25px; line-height: 32px; text-align: center; }
|
|
19
|
+
.brand-caption { display: block; color: var(--jsl-color-text-muted); font-size: 11px; font-weight: 400; }
|
|
20
|
+
.nav-label { display: flex; justify-content: space-between; padding: 0 12px; margin: 48px 0 12px; color: var(--jsl-color-text-muted); font-size: 10px; letter-spacing: 1.3px; font-weight: 600; }
|
|
21
|
+
.nav-item { display: flex; align-items: center; gap: 10px; padding: 9px 12px; margin-bottom: 4px; border-radius: 6px; color: var(--jsl-color-text-secondary); text-decoration: none; font-size: 13px; font-weight: 600; }
|
|
22
|
+
.nav-item:hover { background: var(--jsl-color-surface-hover); }
|
|
23
|
+
.nav-item[aria-current] { background: var(--jsl-color-surface-selected); color: var(--jsl-color-text); }
|
|
24
|
+
.nav-number { margin-left: auto; font-size: 10px; font-weight: 400; color: var(--jsl-color-text-muted); }
|
|
25
|
+
.nav-icon { font-size: 17px; }
|
|
26
|
+
.sidebar nav { min-height: 0; overflow-y: auto; scrollbar-width: thin; }
|
|
27
|
+
.sidebar-note { margin-top: auto; padding: 20px 10px 0; border-top: 1px solid var(--jsl-color-border-subtle); color: var(--jsl-color-text-secondary); font-size: 11px; }
|
|
28
|
+
.sidebar-note p { color: var(--jsl-color-text-muted); margin: 8px 0 0; line-height: 1.7; }
|
|
29
|
+
.status-dot { display: inline-block; width: 6px; height: 6px; background: #16a085; border-radius: 50%; margin-right: 6px; vertical-align: middle; }
|
|
30
|
+
main { max-width: 1560px; margin-left: 224px; padding: 28px 48px 0; }
|
|
31
|
+
.page-meta { display: flex; align-items: center; justify-content: space-between; gap: 12px; color: var(--jsl-color-text-muted); font-size: 10px; font-weight: 500; letter-spacing: 1px; padding-bottom: 24px; border-bottom: 1px solid var(--jsl-color-border-subtle); }
|
|
32
|
+
.page-tools { display: flex; align-items: center; gap: 24px; }
|
|
33
|
+
.theme-picker { display: flex; align-items: center; gap: 8px; color: var(--jsl-color-text-secondary); font-size: 11px; letter-spacing: 0; }
|
|
34
|
+
.theme-picker select { max-width: 100%; min-height: 32px; padding: 4px 24px 4px 10px; border: 1px solid var(--jsl-color-border); border-radius: 6px; background: var(--jsl-color-surface); color: var(--jsl-color-text); font: inherit; cursor: pointer; }
|
|
35
|
+
.theme-picker select:focus-visible { outline: 2px solid var(--jsl-color-focus); outline-offset: 3px; }
|
|
36
|
+
.version { font-size: 11px; letter-spacing: 0; display: flex; align-items: center; gap: 8px; }
|
|
37
|
+
.version .status-dot { margin: 0 0 0 10px; }
|
|
38
|
+
.hero { display: flex; justify-content: space-between; align-items: center; gap: 32px; padding: 40px 0 36px; }
|
|
39
|
+
.eyebrow { margin: 0 0 8px; font-size: 10px; letter-spacing: 1.4px; font-weight: 600; color: var(--jsl-color-accent); }
|
|
40
|
+
h1, .section-title { font-size: 42px; letter-spacing: -1.5px; font-weight: 650; line-height: 1.15; margin: 0 0 12px; }
|
|
41
|
+
.hero-description { color: var(--jsl-color-text-muted); max-width: 340px; font-size: 14px; margin: 0; }
|
|
42
|
+
.hero-preview { min-width: 280px; padding: 22px 30px; display: flex; flex-direction: column; align-items: center; gap: 16px; background: var(--jsl-color-surface-hover); border: 1px solid var(--jsl-color-border-subtle); border-radius: 10px; }
|
|
43
|
+
.preview-caption { font-size: 9px; letter-spacing: 1.4px; color: var(--jsl-color-text-muted); font-weight: 500; }
|
|
44
|
+
.preview-note { font-size: 10px; color: var(--jsl-color-text-muted); }
|
|
45
|
+
.overview-bar { display: flex; align-items: center; gap: 24px; padding: 0 0 13px; margin-bottom: 24px; border-bottom: 1px solid var(--jsl-color-border); font-size: 11px; }
|
|
46
|
+
.overview-label { color: var(--jsl-color-text); font-weight: 600; margin-right: auto; }
|
|
47
|
+
.overview-stat { color: var(--jsl-color-text-muted); }
|
|
48
|
+
.sample-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px; }
|
|
49
|
+
.sample-card { background: var(--jsl-color-surface); border: 1px solid var(--jsl-color-border-subtle); border-radius: 10px; padding: 24px; min-width: 0; }
|
|
50
|
+
.sample-card:last-child { grid-column: 1 / -1; }
|
|
51
|
+
.card-heading { display: flex; align-items: center; gap: 10px; }
|
|
52
|
+
.sample-number { color: var(--jsl-color-text-muted); font-size: 10px; font-variant-numeric: tabular-nums; padding-right: 10px; border-right: 1px solid var(--jsl-color-border-subtle); line-height: 16px; }
|
|
53
|
+
h2 { font-size: 14px; font-weight: 600; margin: 0; letter-spacing: -0.15px; }
|
|
54
|
+
.card-description { color: var(--jsl-color-text-muted); font-size: 12px; margin: 8px 0 22px; min-height: 38px; max-width: 360px; }
|
|
55
|
+
.sample-row { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; margin: 14px 0; min-height: 32px; }
|
|
56
|
+
.sample-status { color: var(--jsl-color-text-secondary); font-size: 11px; margin: 12px 0 18px; min-height: 18px; }
|
|
57
|
+
.sample-code { white-space: pre-wrap; overflow-wrap: anywhere; font-family: Consolas, "SFMono-Regular", monospace; font-size: 10px; color: var(--jsl-color-text-secondary); background: var(--jsl-color-surface-subtle); border: 1px solid var(--jsl-color-border-subtle); border-radius: 5px; padding: 12px; margin: 20px 0 0; line-height: 1.8; }
|
|
58
|
+
.inline-note { color: var(--jsl-color-text-muted); font-size: 11px; }
|
|
59
|
+
.showcase-icon { display: block; width: 100%; height: 100%; background: currentColor; mask-repeat: no-repeat; mask-position: center; mask-size: contain; -webkit-mask-repeat: no-repeat; -webkit-mask-position: center; -webkit-mask-size: contain; }
|
|
60
|
+
.format-bold { font-family: Georgia, serif; font-weight: 700; font-size: 17px; }
|
|
61
|
+
.format-italic { font-family: Georgia, serif; font-style: italic; font-size: 17px; }
|
|
62
|
+
.format-underline { font-family: Georgia, serif; text-decoration: underline; font-size: 16px; }
|
|
63
|
+
.sample-divider { width: 1px; height: 20px; background: var(--jsl-color-border-subtle); margin: 0 2px; }
|
|
64
|
+
.size-row { align-items: flex-end; gap: 20px; padding: 0 0 4px; }
|
|
65
|
+
.size-sample { display: flex; flex-direction: column; align-items: flex-start; gap: 8px; }
|
|
66
|
+
.size-caption { font-size: 10px; color: var(--jsl-color-text-muted); }
|
|
67
|
+
.context-panel { border: 1px solid var(--jsl-color-border-subtle); border-radius: 7px; overflow: hidden; margin-bottom: 16px; }
|
|
68
|
+
.context-body { padding: 18px; }
|
|
69
|
+
.context-eyebrow { font-size: 9px; color: var(--jsl-color-text-muted); letter-spacing: 1px; }
|
|
70
|
+
.context-body h3 { font-size: 14px; font-weight: 600; margin: 8px 0 4px; }
|
|
71
|
+
.context-copy { color: var(--jsl-color-text-muted); font-size: 11px; margin: 0; }
|
|
72
|
+
.context-footer { display: flex; gap: 8px; justify-content: flex-end; flex-wrap: wrap; padding: 12px 16px; border-top: 1px solid var(--jsl-color-border-subtle); background: var(--jsl-color-surface-subtle); }
|
|
73
|
+
.count-badge { display: inline-block; margin-left: 8px; min-width: 17px; border-radius: 4px; padding: 0 4px; font-size: 10px; line-height: 17px; color: var(--jsl-color-text-secondary); background: var(--jsl-color-border-subtle); }
|
|
74
|
+
.brand-teal { --jsl-button-primary: #0f766e; --jsl-button-on-primary: #fff; --jsl-button-primary-hover: #115e59; --jsl-button-primary-active: #134e4a; --jsl-button-focus: #0f766e; }
|
|
75
|
+
.usage { margin-top: 24px; padding: 20px 24px; border: 1px solid var(--jsl-color-border-subtle); border-radius: 8px; background: var(--jsl-color-surface); color: var(--jsl-color-text-secondary); font-size: 12px; }
|
|
76
|
+
.usage summary { font-weight: 600; color: var(--jsl-color-text); cursor: pointer; }
|
|
77
|
+
.usage p { max-width: 850px; }
|
|
78
|
+
.page-footer { display: flex; justify-content: space-between; gap: 16px; padding: 24px 0; margin-top: 16px; color: var(--jsl-color-text-muted); font-size: 10px; }
|
|
79
|
+
.component-section { margin-top: 48px; padding-top: 12px; border-top: 1px solid var(--jsl-color-border); scroll-margin-top: 12px; }
|
|
80
|
+
.dialog-sample-grid > .sample-card:last-child { grid-column: auto; }
|
|
81
|
+
.dialog-sample-grid h3 { margin: 0; font-size: 14px; font-weight: 600; letter-spacing: -0.15px; }
|
|
82
|
+
.showcase-dialog-copy > p { margin: 0 0 20px; color: var(--jsl-color-text-secondary); }
|
|
83
|
+
.showcase-dialog-copy > :last-child { margin-bottom: 0; }
|
|
84
|
+
.dialog-summary { display: grid; grid-template-columns: auto 1fr; gap: 10px 24px; padding: 16px; border: 1px solid var(--jsl-color-border-subtle); border-radius: 6px; background: var(--jsl-color-surface-subtle); font-size: 12px; }
|
|
85
|
+
.dialog-summary-label { color: var(--jsl-color-text-muted); }
|
|
86
|
+
.dialog-form-field { display: flex; flex-direction: column; gap: 6px; margin-bottom: 18px; }
|
|
87
|
+
.dialog-form-field label { font-size: 12px; font-weight: 600; }
|
|
88
|
+
.dialog-form-field input, .dialog-form-field textarea { width: 100%; padding: 9px 10px; border: 1px solid var(--jsl-color-border); border-radius: 6px; background: var(--jsl-color-surface); color: var(--jsl-color-text); font: inherit; font-size: 13px; }
|
|
89
|
+
.dialog-form-field textarea { resize: vertical; }
|
|
90
|
+
.dialog-form-field input::placeholder, .dialog-form-field textarea::placeholder { color: var(--jsl-color-text-muted); }
|
|
91
|
+
.dialog-form-field input:focus-visible, .dialog-form-field textarea:focus-visible { outline: 2px solid var(--jsl-color-focus); outline-offset: 2px; }
|
|
92
|
+
.dialog-member { display: flex; align-items: center; gap: 12px; padding: 12px 0; border-bottom: 1px solid var(--jsl-color-border-subtle); }
|
|
93
|
+
.dialog-member:last-child { border-bottom: 0; }
|
|
94
|
+
.dialog-member-avatar { display: grid; place-items: center; flex: 0 0 auto; width: 34px; height: 34px; border-radius: 50%; background: var(--jsl-color-surface-selected); color: var(--jsl-color-text-secondary); font-size: 11px; }
|
|
95
|
+
.dialog-member > div { flex: 1; min-width: 0; }
|
|
96
|
+
.dialog-member strong { display: block; font-size: 12px; font-weight: 600; }
|
|
97
|
+
.dialog-member > div > span { display: block; color: var(--jsl-color-text-muted); font-size: 11px; }
|
|
98
|
+
.dialog-member-role { color: var(--jsl-color-text-secondary); font-size: 11px; }
|
|
99
|
+
.dialog-help { margin-top: 18px !important; font-size: 12px; }
|
|
100
|
+
.dialog-check { display: flex; align-items: center; gap: 8px; font-size: 12px; margin-bottom: 18px; }
|
|
101
|
+
.dialog-check input { accent-color: var(--jsl-color-accent); }
|
|
102
|
+
.tabs-sample-grid > .sample-card:last-child { grid-column: auto; }
|
|
103
|
+
.tabs-sample-grid h3 { margin: 0; font-size: 14px; font-weight: 600; letter-spacing: -0.15px; }
|
|
104
|
+
.tabs-example-copy h4 { margin: 0 0 8px; font-size: 13px; font-weight: 600; }
|
|
105
|
+
.tabs-example-copy p { margin: 0 0 12px; color: var(--jsl-color-text-secondary); font-size: 12px; }
|
|
106
|
+
.tabs-example-copy > :last-child { margin-bottom: 0; }
|
|
107
|
+
.tabs-example-copy label { display: block; margin-bottom: 6px; font-size: 12px; font-weight: 600; }
|
|
108
|
+
.tabs-draft-input { display: block; width: 100%; margin: 0 0 12px; padding: 9px 10px; border: 1px solid var(--jsl-color-border); border-radius: 6px; background: var(--jsl-color-surface); color: var(--jsl-color-text); font: inherit; font-size: 12px; }
|
|
109
|
+
.tabs-draft-input::placeholder { color: var(--jsl-color-text-muted); }
|
|
110
|
+
.tabs-draft-input:focus-visible { outline: 2px solid var(--jsl-color-focus); outline-offset: 2px; }
|
|
111
|
+
.tabs-example-check { display: flex; align-items: center; gap: 8px; color: var(--jsl-color-text-secondary); font-size: 11px; }
|
|
112
|
+
.tabs-example-check input { accent-color: var(--jsl-color-accent); }
|
|
113
|
+
.tabs-rich-header { display: inline-flex; align-items: center; gap: 8px; }
|
|
114
|
+
.tabs-header-badge { min-width: 18px; padding: 0 5px; border-radius: 4px; background: var(--jsl-color-surface-selected); color: var(--jsl-color-text-secondary); font-size: 10px; line-height: 18px; text-align: center; }
|
|
115
|
+
.tabs-hero-demo { width: 100%; }
|
|
116
|
+
.tabs-hero-demo > .tab-panels { border-radius: 0 0 6px 6px; }
|
|
117
|
+
.tabs-hero-demo .tab-content p { margin: 0; color: var(--jsl-color-text-secondary); font-size: 11px; }
|
|
118
|
+
.date-sample-grid > .sample-card:last-child { grid-column: auto; }
|
|
119
|
+
.date-sample-grid h3 { margin: 0; font-size: 14px; font-weight: 600; letter-spacing: -.15px; }
|
|
120
|
+
.date-hero-preview { gap: 20px; }
|
|
121
|
+
.date-hero-preview > .date-range-comp { width: 100%; }
|
|
122
|
+
.date-showcase-field { display: flex; flex-direction: column; align-items: flex-start; gap: 8px; margin: 14px 0; }
|
|
123
|
+
.date-showcase-field > label { color: var(--jsl-color-text-secondary); font-size: 12px; font-weight: 500; }
|
|
124
|
+
.slider-sample { width: 100%; padding: 16px 10px 0; }
|
|
125
|
+
.showcase-slider { margin: 8px 0 20px; }
|
|
126
|
+
.slider-readout { display: block; color: var(--jsl-color-text-secondary); font-size: 12px; font-variant-numeric: tabular-nums; }
|
|
127
|
+
.slider-with-tooltip { padding-top: 40px; }
|
|
128
|
+
.slider-orientations { display: flex; gap: 40px; align-items: center; padding: 20px 12px; }
|
|
129
|
+
.showcase-slider-vertical { height: 112px; flex-shrink: 0; margin: 0; }
|
|
130
|
+
.slider-disabled-example { flex: 1; min-width: 0; }
|
|
131
|
+
.showcase-calendar { max-width: 100%; }
|
|
132
|
+
.select-sample-grid > .sample-card:last-child { grid-column: auto; }
|
|
133
|
+
.select-sample-grid h3 { margin: 0; font-size: 14px; font-weight: 600; letter-spacing: -.15px; }
|
|
134
|
+
.select-showcase-field { display: flex; flex-direction: column; gap: 8px; margin: 14px 0; width: 100%; }
|
|
135
|
+
.select-showcase-field > label { color: var(--jsl-color-text-secondary); font-size: 12px; font-weight: 500; }
|
|
136
|
+
.select-showcase-field > .select-comp { width: 100%; }
|
|
137
|
+
.select-hero-preview { width: 24rem; max-width: 100%; }
|
|
138
|
+
.select-hero-preview .select-showcase-field { margin: 0; }
|
|
139
|
+
.select-person { display: flex; gap: 10px; align-items: center; min-width: 0; }
|
|
140
|
+
.select-person-avatar { display: grid; place-items: center; width: 30px; height: 30px; flex-shrink: 0; border-radius: 50%; background: var(--jsl-color-surface-selected); color: var(--jsl-color-text-secondary); font-size: 10px; }
|
|
141
|
+
.select-person-copy { min-width: 0; }
|
|
142
|
+
.select-person-copy strong { display: block; font-size: 12px; font-weight: 600; }
|
|
143
|
+
.select-person-copy > span { display: block; font-size: 11px; color: var(--jsl-color-text-muted); }
|
|
144
|
+
.checks-expander-grid > .sample-card:last-child { grid-column: auto; }
|
|
145
|
+
.checks-expander-grid h3 { margin: 0; font-size: 14px; font-weight: 600; letter-spacing: -.15px; }
|
|
146
|
+
.checks-expander-preview { width: 24rem; max-width: 100%; }
|
|
147
|
+
.checks-expander-preview > .expander-comp { width: 100%; }
|
|
148
|
+
.checkbox-stack { display: flex; flex-direction: column; align-items: flex-start; gap: 16px; }
|
|
149
|
+
.checkbox-child-list { display: flex; flex-direction: column; gap: 12px; padding-left: 28px; }
|
|
150
|
+
.expander-example-copy h4 { margin: 0 0 8px; font-size: 13px; font-weight: 600; }
|
|
151
|
+
.expander-example-copy p { margin: 0; color: var(--jsl-color-text-secondary); font-size: 12px; }
|
|
152
|
+
.expander-example-copy > label { display: block; margin-bottom: 6px; font-size: 12px; font-weight: 500; }
|
|
153
|
+
.expander-preview-copy { margin: 0; color: var(--jsl-color-text-secondary); font-size: 12px; }
|
|
154
|
+
.expander-rich-header { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px; }
|
|
155
|
+
.expander-stack { display: flex; flex-direction: column; gap: 12px; }
|
|
156
|
+
.expander-custom-icon { display: block; font-size: 20px; line-height: 1rem; }
|
|
157
|
+
.fields-sample-grid > .sample-card:last-child { grid-column: auto; }
|
|
158
|
+
.fields-sample-grid h3 { margin: 0; font-size: 14px; font-weight: 600; letter-spacing: -.15px; }
|
|
159
|
+
.fields-preview { width: 24rem; max-width: 100%; }
|
|
160
|
+
.fields-preview > .jsl-input, .fields-preview > .form-field { width: 100%; }
|
|
161
|
+
.fields-preview > .form-field { margin-bottom: 0; }
|
|
162
|
+
.field-sample { display: flex; flex-direction: column; gap: 8px; margin: 14px 0; }
|
|
163
|
+
.field-sample > label { color: var(--jsl-color-text-secondary); font-size: 12px; font-weight: 500; }
|
|
164
|
+
.field-sample > .jsl-input { width: 100%; }
|
|
165
|
+
.unstyled-input-sample { display: flex; align-items: center; gap: 12px; padding: 16px; border: 1px solid var(--jsl-color-border-subtle); border-radius: 6px; }
|
|
166
|
+
.unstyled-input-sample > span { flex-shrink: 0; white-space: nowrap; }
|
|
167
|
+
.showcase-inline-input { width: 100%; min-width: 0; padding: 4px 0; border: 0; background: transparent; color: var(--jsl-color-text); font: inherit; }
|
|
168
|
+
.showcase-inline-input:focus-visible { outline: 2px solid var(--jsl-color-focus); outline-offset: 3px; }
|
|
169
|
+
.composed-fields { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; }
|
|
170
|
+
@media (max-width: 560px) { .composed-fields { grid-template-columns: 1fr; gap: 0; } }
|
|
171
|
+
|
|
172
|
+
@media (min-width: 1784px) { main { margin-right: auto; } }
|
|
173
|
+
@media (max-width: 1160px) {
|
|
174
|
+
main { padding: 24px 28px 0; }
|
|
175
|
+
.sample-grid { grid-template-columns: 1fr; }
|
|
176
|
+
.hero-preview { min-width: 240px; padding: 20px; }
|
|
177
|
+
}
|
|
178
|
+
@media (max-width: 800px) {
|
|
179
|
+
.page-meta { flex-wrap: wrap; }
|
|
180
|
+
.page-tools { flex-wrap: wrap; gap: 12px; }
|
|
181
|
+
.sidebar { width: 180px; padding: 24px 14px; }
|
|
182
|
+
main { margin-left: 180px; padding: 24px 20px 0; }
|
|
183
|
+
.hero { flex-direction: column; align-items: stretch; gap: 24px; padding: 28px 0; }
|
|
184
|
+
.hero-description { max-width: none; }
|
|
185
|
+
.overview-bar { gap: 16px; flex-wrap: wrap; }
|
|
186
|
+
}
|
|
187
|
+
@media (max-width: 560px) {
|
|
188
|
+
.sidebar { position: static; width: auto; padding: 16px 20px; border-right: 0; border-bottom: 1px solid var(--jsl-color-border-subtle); gap: 16px; }
|
|
189
|
+
.brand { padding: 0; }
|
|
190
|
+
.nav-label, .sidebar-note { display: none; }
|
|
191
|
+
.nav-item { padding: 7px 10px; }
|
|
192
|
+
main { margin-left: 0; padding: 20px 16px 0; }
|
|
193
|
+
.page-meta { font-size: 9px; padding-bottom: 16px; }
|
|
194
|
+
.version { font-size: 10px; gap: 5px; }
|
|
195
|
+
.version .status-dot { margin-left: 2px; }
|
|
196
|
+
h1, .section-title { font-size: 36px; }
|
|
197
|
+
.sample-card { padding: 20px; }
|
|
198
|
+
.sample-grid { gap: 16px; }
|
|
199
|
+
.overview-bar { gap: 12px; font-size: 10px; }
|
|
200
|
+
.sample-row { gap: 8px; }
|
|
201
|
+
.page-footer { flex-direction: column; gap: 4px; }
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
/* Feedback and navigation examples. */
|
|
205
|
+
.feedback-sample-grid > .sample-card:last-child { grid-column: auto; }
|
|
206
|
+
.feedback-sample-grid h3 { margin: 0; font-size: 14px; font-weight: 600; }
|
|
207
|
+
.feedback-preview { width: 24rem; max-width: 100%; }
|
|
208
|
+
.notification-samples { display: flex; flex-direction: column; gap: 12px; margin-bottom: 20px; }
|
|
209
|
+
.notification-samples .jsl-notification { box-shadow: none; }
|
|
210
|
+
.notification-action-copy p { margin: 0 0 12px; }
|
|
211
|
+
.loading-label-samples { display: flex; flex-direction: column; gap: 24px; }
|
|
212
|
+
.loading-demo { display: flex; flex-direction: column; align-items: flex-start; gap: 16px; }
|
|
213
|
+
.loading-demo-panel { align-self: stretch; min-height: 72px; display: flex; align-items: center; padding: 16px; border: 1px solid var(--jsl-color-border-subtle); border-radius: 6px; }
|
|
214
|
+
.loading-demo-panel p { margin: 0; color: var(--jsl-color-text-secondary); font-size: 12px; }
|
|
215
|
+
#navigation-bar { grid-column: 1 / -1; }
|
|
216
|
+
.navigation-preview { width: 100%; }
|
|
217
|
+
.navigation-compact-sample { width: 22rem; max-width: 100%; }
|
|
218
|
+
.navigation-rich-brand { display: flex; align-items: center; gap: 8px; }
|
|
219
|
+
.navigation-brand-mark { display: grid; place-items: center; width: 24px; height: 24px; border-radius: 6px; background: var(--jsl-color-accent); color: var(--jsl-color-on-accent); font-size: 12px; }
|
|
220
|
+
.remaining-demo { display: flex; flex-direction: column; gap: 20px; margin-top: 24px; }
|
|
221
|
+
.remaining-demo h3 { margin: 0; font-size: 14px; font-weight: 600; }
|
|
222
|
+
.layout-demo-panel { padding: 16px; background: var(--jsl-color-surface); color: var(--jsl-color-text); overflow: auto; height: 100%; box-sizing: border-box; }
|
|
223
|
+
.layout-demo-panel p { color: var(--jsl-color-text-secondary); font-size: 13px; line-height: 1.6; }
|
|
224
|
+
.tree-demo-content { display: flex; align-items: center; gap: 8px; }
|
|
225
|
+
.grid-samples { display: flex; flex-direction: column; gap: 24px; margin: 24px 0; }
|
|
226
|
+
.grid-sample-card { min-width: 0; }
|
|
227
|
+
.grid-sample-card h3 { margin: 0; font-size: 14px; font-weight: 600; }
|
|
228
|
+
.grid-sample-host { min-width: 0; }
|
|
229
|
+
.page-tools { flex-wrap: wrap; }
|
|
230
|
+
.format-preview { color: var(--jsl-color-text-muted); font-size: 11px; letter-spacing: 0; white-space: nowrap; }
|
|
231
|
+
#grid-reorder .grid-row-handle { cursor: grab; text-align: center; color: var(--jsl-color-text-muted); }
|