@unofficialbox/box-open-elements 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.
- package/LICENSE +21 -0
- package/README.md +125 -0
- package/dist/components/actions/button-group.d.ts +22 -0
- package/dist/components/actions/button-group.js +255 -0
- package/dist/components/actions/button.d.ts +16 -0
- package/dist/components/actions/button.js +190 -0
- package/dist/components/actions/icon-button.d.ts +20 -0
- package/dist/components/actions/icon-button.js +187 -0
- package/dist/components/actions/link-button.d.ts +14 -0
- package/dist/components/actions/link-button.js +137 -0
- package/dist/components/actions/menu-item.d.ts +17 -0
- package/dist/components/actions/menu-item.js +137 -0
- package/dist/components/actions/menu.d.ts +22 -0
- package/dist/components/actions/menu.js +178 -0
- package/dist/components/actions/segmented-control.d.ts +27 -0
- package/dist/components/actions/segmented-control.js +273 -0
- package/dist/components/collections/card.d.ts +13 -0
- package/dist/components/collections/card.js +110 -0
- package/dist/components/collections/carousel.d.ts +40 -0
- package/dist/components/collections/carousel.js +406 -0
- package/dist/components/collections/datalist-item.d.ts +32 -0
- package/dist/components/collections/datalist-item.js +196 -0
- package/dist/components/collections/draggable-list.d.ts +33 -0
- package/dist/components/collections/draggable-list.js +306 -0
- package/dist/components/collections/grid-view.d.ts +38 -0
- package/dist/components/collections/grid-view.js +321 -0
- package/dist/components/collections/pagination.d.ts +19 -0
- package/dist/components/collections/pagination.js +147 -0
- package/dist/components/collections/tree-grid.d.ts +47 -0
- package/dist/components/collections/tree-grid.js +593 -0
- package/dist/components/collections/tree.d.ts +37 -0
- package/dist/components/collections/tree.js +526 -0
- package/dist/components/feedback/alert.d.ts +27 -0
- package/dist/components/feedback/alert.js +263 -0
- package/dist/components/feedback/badge.d.ts +12 -0
- package/dist/components/feedback/badge.js +99 -0
- package/dist/components/feedback/chip.d.ts +33 -0
- package/dist/components/feedback/chip.js +261 -0
- package/dist/components/feedback/empty-state.d.ts +19 -0
- package/dist/components/feedback/empty-state.js +137 -0
- package/dist/components/feedback/error-mask.d.ts +25 -0
- package/dist/components/feedback/error-mask.js +199 -0
- package/dist/components/feedback/help-text.d.ts +22 -0
- package/dist/components/feedback/help-text.js +176 -0
- package/dist/components/feedback/nudge.d.ts +32 -0
- package/dist/components/feedback/nudge.js +299 -0
- package/dist/components/feedback/progress-bar.d.ts +18 -0
- package/dist/components/feedback/progress-bar.js +128 -0
- package/dist/components/feedback/progress-ring.d.ts +21 -0
- package/dist/components/feedback/progress-ring.js +155 -0
- package/dist/components/feedback/progress-steps.d.ts +25 -0
- package/dist/components/feedback/progress-steps.js +276 -0
- package/dist/components/feedback/skeleton.d.ts +14 -0
- package/dist/components/feedback/skeleton.js +95 -0
- package/dist/components/feedback/spinner.d.ts +10 -0
- package/dist/components/feedback/spinner.js +80 -0
- package/dist/components/feedback/toast.d.ts +26 -0
- package/dist/components/feedback/toast.js +205 -0
- package/dist/components/files/drop-zone.d.ts +19 -0
- package/dist/components/files/drop-zone.js +169 -0
- package/dist/components/forms/calendar.d.ts +47 -0
- package/dist/components/forms/calendar.js +499 -0
- package/dist/components/forms/category-selector.d.ts +35 -0
- package/dist/components/forms/category-selector.js +269 -0
- package/dist/components/forms/checkbox-group.d.ts +31 -0
- package/dist/components/forms/checkbox-group.js +267 -0
- package/dist/components/forms/checkbox.d.ts +28 -0
- package/dist/components/forms/checkbox.js +250 -0
- package/dist/components/forms/color-picker.d.ts +34 -0
- package/dist/components/forms/color-picker.js +314 -0
- package/dist/components/forms/combobox.d.ts +37 -0
- package/dist/components/forms/combobox.js +234 -0
- package/dist/components/forms/date-field.d.ts +27 -0
- package/dist/components/forms/date-field.js +187 -0
- package/dist/components/forms/dropdown.d.ts +38 -0
- package/dist/components/forms/dropdown.js +405 -0
- package/dist/components/forms/dual-listbox.d.ts +44 -0
- package/dist/components/forms/dual-listbox.js +484 -0
- package/dist/components/forms/fieldset.d.ts +32 -0
- package/dist/components/forms/fieldset.js +168 -0
- package/dist/components/forms/multi-select.d.ts +30 -0
- package/dist/components/forms/multi-select.js +264 -0
- package/dist/components/forms/number-input.d.ts +32 -0
- package/dist/components/forms/number-input.js +245 -0
- package/dist/components/forms/pill-cloud.d.ts +35 -0
- package/dist/components/forms/pill-cloud.js +230 -0
- package/dist/components/forms/pill-selector-dropdown.d.ts +55 -0
- package/dist/components/forms/pill-selector-dropdown.js +499 -0
- package/dist/components/forms/radio-group.d.ts +32 -0
- package/dist/components/forms/radio-group.js +285 -0
- package/dist/components/forms/range-slider.d.ts +36 -0
- package/dist/components/forms/range-slider.js +294 -0
- package/dist/components/forms/rating.d.ts +31 -0
- package/dist/components/forms/rating.js +302 -0
- package/dist/components/forms/rich-text-input.d.ts +32 -0
- package/dist/components/forms/rich-text-input.js +403 -0
- package/dist/components/forms/search-field.d.ts +27 -0
- package/dist/components/forms/search-field.js +293 -0
- package/dist/components/forms/select.d.ts +30 -0
- package/dist/components/forms/select.js +198 -0
- package/dist/components/forms/slider.d.ts +31 -0
- package/dist/components/forms/slider.js +221 -0
- package/dist/components/forms/spin-button.d.ts +33 -0
- package/dist/components/forms/spin-button.js +352 -0
- package/dist/components/forms/switch.d.ts +32 -0
- package/dist/components/forms/switch.js +302 -0
- package/dist/components/forms/tag-input.d.ts +46 -0
- package/dist/components/forms/tag-input.js +420 -0
- package/dist/components/forms/text-area.d.ts +26 -0
- package/dist/components/forms/text-area.js +188 -0
- package/dist/components/forms/text-field.d.ts +24 -0
- package/dist/components/forms/text-field.js +151 -0
- package/dist/components/forms/time-field.d.ts +29 -0
- package/dist/components/forms/time-field.js +203 -0
- package/dist/components/identity/avatar.d.ts +21 -0
- package/dist/components/identity/avatar.js +191 -0
- package/dist/components/identity/contact-datalist-item.d.ts +31 -0
- package/dist/components/identity/contact-datalist-item.js +235 -0
- package/dist/components/identity/persona.d.ts +28 -0
- package/dist/components/identity/persona.js +272 -0
- package/dist/components/layout/app-shell.d.ts +26 -0
- package/dist/components/layout/app-shell.js +258 -0
- package/dist/components/layout/divider.d.ts +12 -0
- package/dist/components/layout/divider.js +119 -0
- package/dist/components/layout/nav-sidebar.d.ts +23 -0
- package/dist/components/layout/nav-sidebar.js +167 -0
- package/dist/components/layout/section.d.ts +20 -0
- package/dist/components/layout/section.js +143 -0
- package/dist/components/layout/sidebar-toggle-button.d.ts +26 -0
- package/dist/components/layout/sidebar-toggle-button.js +137 -0
- package/dist/components/layout/split-view.d.ts +19 -0
- package/dist/components/layout/split-view.js +157 -0
- package/dist/components/navigation/accordion.d.ts +25 -0
- package/dist/components/navigation/accordion.js +253 -0
- package/dist/components/navigation/tabs.d.ts +27 -0
- package/dist/components/navigation/tabs.js +289 -0
- package/dist/components/overlays/dialog.d.ts +26 -0
- package/dist/components/overlays/dialog.js +267 -0
- package/dist/components/overlays/drawer.d.ts +32 -0
- package/dist/components/overlays/drawer.js +323 -0
- package/dist/components/overlays/popover.d.ts +35 -0
- package/dist/components/overlays/popover.js +317 -0
- package/dist/components/overlays/tooltip.d.ts +26 -0
- package/dist/components/overlays/tooltip.js +204 -0
- package/dist/components/visuals/illustration.d.ts +26 -0
- package/dist/components/visuals/illustration.js +319 -0
- package/dist/core/controller.d.ts +11 -0
- package/dist/core/controller.js +23 -0
- package/dist/core/element.d.ts +22 -0
- package/dist/core/element.js +28 -0
- package/dist/core/event-emitter.d.ts +9 -0
- package/dist/core/event-emitter.js +33 -0
- package/dist/core/form-associated.d.ts +63 -0
- package/dist/core/form-associated.js +218 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.js +4 -0
- package/dist/core/json-schema.d.ts +1 -0
- package/dist/core/json-schema.js +1 -0
- package/dist/foundations/a11y/focus.d.ts +17 -0
- package/dist/foundations/a11y/focus.js +94 -0
- package/dist/foundations/a11y/heading.d.ts +26 -0
- package/dist/foundations/a11y/heading.js +40 -0
- package/dist/foundations/a11y/index.d.ts +5 -0
- package/dist/foundations/a11y/index.js +3 -0
- package/dist/foundations/a11y/keyboard.d.ts +28 -0
- package/dist/foundations/a11y/keyboard.js +77 -0
- package/dist/foundations/geometry/index.d.ts +1 -0
- package/dist/foundations/geometry/index.js +1 -0
- package/dist/foundations/geometry/tokens.d.ts +123 -0
- package/dist/foundations/geometry/tokens.js +154 -0
- package/dist/foundations/icons/box-iconography.d.ts +479 -0
- package/dist/foundations/icons/box-iconography.generated.d.ts +2370 -0
- package/dist/foundations/icons/box-iconography.generated.js +4010 -0
- package/dist/foundations/icons/box-iconography.js +39 -0
- package/dist/foundations/icons/index.d.ts +1 -0
- package/dist/foundations/icons/index.js +1 -0
- package/dist/foundations/motion/index.d.ts +2 -0
- package/dist/foundations/motion/index.js +1 -0
- package/dist/foundations/motion/tokens.d.ts +39 -0
- package/dist/foundations/motion/tokens.js +43 -0
- package/dist/foundations/tokens/box-dark.d.ts +11 -0
- package/dist/foundations/tokens/box-dark.js +46 -0
- package/dist/foundations/tokens/box-defaults.d.ts +5 -0
- package/dist/foundations/tokens/box-defaults.js +52 -0
- package/dist/foundations/tokens/index.d.ts +5 -0
- package/dist/foundations/tokens/index.js +4 -0
- package/dist/foundations/tokens/interaction.d.ts +28 -0
- package/dist/foundations/tokens/interaction.js +72 -0
- package/dist/foundations/tokens/registry.d.ts +14 -0
- package/dist/foundations/tokens/registry.js +92 -0
- package/dist/foundations/tokens/types.d.ts +16 -0
- package/dist/foundations/tokens/types.js +1 -0
- package/dist/foundations/typography/index.d.ts +2 -0
- package/dist/foundations/typography/index.js +1 -0
- package/dist/foundations/typography/tokens.d.ts +76 -0
- package/dist/foundations/typography/tokens.js +27 -0
- package/dist/index.d.ts +87 -0
- package/dist/index.js +98 -0
- package/dist/patterns/content-explorer/actions/controller.d.ts +12 -0
- package/dist/patterns/content-explorer/actions/controller.js +36 -0
- package/dist/patterns/content-explorer/actions/index.d.ts +2 -0
- package/dist/patterns/content-explorer/actions/index.js +1 -0
- package/dist/patterns/content-explorer/actions/types.d.ts +13 -0
- package/dist/patterns/content-explorer/actions/types.js +1 -0
- package/dist/patterns/content-explorer/adapters/action-menu.d.ts +24 -0
- package/dist/patterns/content-explorer/adapters/action-menu.js +312 -0
- package/dist/patterns/content-explorer/adapters/breadcrumbs.d.ts +15 -0
- package/dist/patterns/content-explorer/adapters/breadcrumbs.js +161 -0
- package/dist/patterns/content-explorer/adapters/item-summary.d.ts +11 -0
- package/dist/patterns/content-explorer/adapters/item-summary.js +72 -0
- package/dist/patterns/content-explorer/adapters/items.d.ts +4 -0
- package/dist/patterns/content-explorer/adapters/items.js +12 -0
- package/dist/patterns/content-explorer/adapters/list.d.ts +28 -0
- package/dist/patterns/content-explorer/adapters/list.js +527 -0
- package/dist/patterns/content-explorer/adapters/table.d.ts +23 -0
- package/dist/patterns/content-explorer/adapters/table.js +467 -0
- package/dist/patterns/content-explorer/adapters/toolbar.d.ts +19 -0
- package/dist/patterns/content-explorer/adapters/toolbar.js +234 -0
- package/dist/patterns/content-explorer/box-transport.d.ts +44 -0
- package/dist/patterns/content-explorer/box-transport.js +229 -0
- package/dist/patterns/content-explorer/collection/controller.d.ts +17 -0
- package/dist/patterns/content-explorer/collection/controller.js +67 -0
- package/dist/patterns/content-explorer/collection/index.d.ts +2 -0
- package/dist/patterns/content-explorer/collection/index.js +1 -0
- package/dist/patterns/content-explorer/collection/types.d.ts +20 -0
- package/dist/patterns/content-explorer/collection/types.js +1 -0
- package/dist/patterns/content-explorer/content-explorer.d.ts +85 -0
- package/dist/patterns/content-explorer/content-explorer.js +745 -0
- package/dist/patterns/content-explorer/contracts.d.ts +32 -0
- package/dist/patterns/content-explorer/contracts.js +114 -0
- package/dist/patterns/content-explorer/controller.d.ts +34 -0
- package/dist/patterns/content-explorer/controller.js +399 -0
- package/dist/patterns/content-explorer/host-bindings.d.ts +50 -0
- package/dist/patterns/content-explorer/host-bindings.js +76 -0
- package/dist/patterns/content-explorer/index.d.ts +18 -0
- package/dist/patterns/content-explorer/index.js +24 -0
- package/dist/patterns/content-explorer/navigation/controller.d.ts +10 -0
- package/dist/patterns/content-explorer/navigation/controller.js +48 -0
- package/dist/patterns/content-explorer/navigation/index.d.ts +2 -0
- package/dist/patterns/content-explorer/navigation/index.js +1 -0
- package/dist/patterns/content-explorer/navigation/types.d.ts +20 -0
- package/dist/patterns/content-explorer/navigation/types.js +1 -0
- package/dist/patterns/content-explorer/schemas.d.ts +6 -0
- package/dist/patterns/content-explorer/schemas.js +120 -0
- package/dist/patterns/content-explorer/selection/controller.d.ts +12 -0
- package/dist/patterns/content-explorer/selection/controller.js +54 -0
- package/dist/patterns/content-explorer/selection/index.d.ts +2 -0
- package/dist/patterns/content-explorer/selection/index.js +1 -0
- package/dist/patterns/content-explorer/selection/types.d.ts +14 -0
- package/dist/patterns/content-explorer/selection/types.js +1 -0
- package/dist/patterns/content-explorer/types.d.ts +209 -0
- package/dist/patterns/content-explorer/types.js +10 -0
- package/dist/patterns/file-request/file-request-builder.d.ts +36 -0
- package/dist/patterns/file-request/file-request-builder.js +344 -0
- package/dist/patterns/file-request/index.d.ts +1 -0
- package/dist/patterns/file-request/index.js +1 -0
- package/dist/patterns/governance/governance-panel.d.ts +40 -0
- package/dist/patterns/governance/governance-panel.js +351 -0
- package/dist/patterns/governance/index.d.ts +1 -0
- package/dist/patterns/governance/index.js +1 -0
- package/dist/patterns/insights/bar-chart.d.ts +43 -0
- package/dist/patterns/insights/bar-chart.js +462 -0
- package/dist/patterns/insights/chart-panel.d.ts +43 -0
- package/dist/patterns/insights/chart-panel.js +436 -0
- package/dist/patterns/insights/donut-chart.d.ts +43 -0
- package/dist/patterns/insights/donut-chart.js +535 -0
- package/dist/patterns/insights/index.d.ts +5 -0
- package/dist/patterns/insights/index.js +5 -0
- package/dist/patterns/insights/line-chart.d.ts +46 -0
- package/dist/patterns/insights/line-chart.js +511 -0
- package/dist/patterns/insights/metric-card.d.ts +36 -0
- package/dist/patterns/insights/metric-card.js +278 -0
- package/dist/patterns/item/bulk-action-bar.d.ts +35 -0
- package/dist/patterns/item/bulk-action-bar.js +325 -0
- package/dist/patterns/item/index.d.ts +4 -0
- package/dist/patterns/item/index.js +4 -0
- package/dist/patterns/item/item-details-panel.d.ts +61 -0
- package/dist/patterns/item/item-details-panel.js +429 -0
- package/dist/patterns/item/item-form.d.ts +54 -0
- package/dist/patterns/item/item-form.js +485 -0
- package/dist/patterns/item/preview-header.d.ts +46 -0
- package/dist/patterns/item/preview-header.js +323 -0
- package/dist/patterns/metadata/contracts.d.ts +75 -0
- package/dist/patterns/metadata/contracts.js +91 -0
- package/dist/patterns/metadata/index.d.ts +4 -0
- package/dist/patterns/metadata/index.js +4 -0
- package/dist/patterns/metadata/metadata-filter-builder.d.ts +43 -0
- package/dist/patterns/metadata/metadata-filter-builder.js +362 -0
- package/dist/patterns/metadata/metadata-inspector.d.ts +31 -0
- package/dist/patterns/metadata/metadata-inspector.js +245 -0
- package/dist/patterns/metadata/schemas.d.ts +5 -0
- package/dist/patterns/metadata/schemas.js +66 -0
- package/dist/patterns/preview/annotation-inspector.d.ts +44 -0
- package/dist/patterns/preview/annotation-inspector.js +380 -0
- package/dist/patterns/preview/annotation-thread.d.ts +37 -0
- package/dist/patterns/preview/annotation-thread.js +338 -0
- package/dist/patterns/preview/annotation-toolbar.d.ts +42 -0
- package/dist/patterns/preview/annotation-toolbar.js +393 -0
- package/dist/patterns/preview/content-preview-adapter.d.ts +13 -0
- package/dist/patterns/preview/content-preview-adapter.js +30 -0
- package/dist/patterns/preview/index.d.ts +6 -0
- package/dist/patterns/preview/index.js +6 -0
- package/dist/patterns/preview/preview-element.d.ts +41 -0
- package/dist/patterns/preview/preview-element.js +429 -0
- package/dist/patterns/preview/provider-adapter.d.ts +36 -0
- package/dist/patterns/preview/provider-adapter.js +29 -0
- package/dist/patterns/search/filter-bar.d.ts +50 -0
- package/dist/patterns/search/filter-bar.js +379 -0
- package/dist/patterns/search/index.d.ts +3 -0
- package/dist/patterns/search/index.js +3 -0
- package/dist/patterns/search/saved-view-picker.d.ts +25 -0
- package/dist/patterns/search/saved-view-picker.js +239 -0
- package/dist/patterns/search/search-results-header.d.ts +34 -0
- package/dist/patterns/search/search-results-header.js +288 -0
- package/dist/patterns/share/access-stats.d.ts +19 -0
- package/dist/patterns/share/access-stats.js +204 -0
- package/dist/patterns/share/collaborator-avatars.d.ts +22 -0
- package/dist/patterns/share/collaborator-avatars.js +214 -0
- package/dist/patterns/share/contracts.d.ts +65 -0
- package/dist/patterns/share/contracts.js +75 -0
- package/dist/patterns/share/index.d.ts +14 -0
- package/dist/patterns/share/index.js +14 -0
- package/dist/patterns/share/invite-collaborators-contracts.d.ts +38 -0
- package/dist/patterns/share/invite-collaborators-contracts.js +1 -0
- package/dist/patterns/share/invite-collaborators-controller.d.ts +40 -0
- package/dist/patterns/share/invite-collaborators-controller.js +86 -0
- package/dist/patterns/share/invite-collaborators-modal.d.ts +46 -0
- package/dist/patterns/share/invite-collaborators-modal.js +465 -0
- package/dist/patterns/share/permission-matrix.d.ts +37 -0
- package/dist/patterns/share/permission-matrix.js +360 -0
- package/dist/patterns/share/presence-contracts.d.ts +26 -0
- package/dist/patterns/share/presence-contracts.js +1 -0
- package/dist/patterns/share/presence-controller.d.ts +31 -0
- package/dist/patterns/share/presence-controller.js +47 -0
- package/dist/patterns/share/presence.d.ts +32 -0
- package/dist/patterns/share/presence.js +255 -0
- package/dist/patterns/share/schemas.d.ts +4 -0
- package/dist/patterns/share/schemas.js +41 -0
- package/dist/patterns/share/share-panel.d.ts +75 -0
- package/dist/patterns/share/share-panel.js +565 -0
- package/dist/patterns/share/unified-share-controller.d.ts +52 -0
- package/dist/patterns/share/unified-share-controller.js +97 -0
- package/dist/patterns/share/unified-share-modal.d.ts +50 -0
- package/dist/patterns/share/unified-share-modal.js +646 -0
- package/dist/patterns/task/index.d.ts +2 -0
- package/dist/patterns/task/index.js +2 -0
- package/dist/patterns/task/review-queue-item.d.ts +45 -0
- package/dist/patterns/task/review-queue-item.js +403 -0
- package/dist/patterns/task/task-assignment-panel.d.ts +50 -0
- package/dist/patterns/task/task-assignment-panel.js +450 -0
- package/package.json +151 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { BaseElement } from "../../core/index.js";
|
|
2
|
+
const DEFAULT_TAG_NAME = "box-section";
|
|
3
|
+
const escapeHtml = (value) => value
|
|
4
|
+
.replaceAll("&", "&")
|
|
5
|
+
.replaceAll("<", "<")
|
|
6
|
+
.replaceAll(">", ">")
|
|
7
|
+
.replaceAll('"', """)
|
|
8
|
+
.replaceAll("'", "'");
|
|
9
|
+
const TITLE_ID = "box-section-title";
|
|
10
|
+
const sectionStyles = `
|
|
11
|
+
:host {
|
|
12
|
+
display: block;
|
|
13
|
+
color: inherit;
|
|
14
|
+
font: inherit;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
[part="section"] {
|
|
18
|
+
display: grid;
|
|
19
|
+
gap: 0.6rem;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
[part="header"] {
|
|
23
|
+
display: flex;
|
|
24
|
+
flex-wrap: wrap;
|
|
25
|
+
align-items: flex-start;
|
|
26
|
+
justify-content: space-between;
|
|
27
|
+
gap: 0.5rem;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
[part="header-main"] {
|
|
31
|
+
display: grid;
|
|
32
|
+
gap: 0.18rem;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
[part="eyebrow"] {
|
|
36
|
+
font-size: 0.72rem;
|
|
37
|
+
font-weight: 700;
|
|
38
|
+
letter-spacing: 0.08em;
|
|
39
|
+
text-transform: uppercase;
|
|
40
|
+
color: var(--boe-token-text-text-secondary, #6f6f6f);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
[part="title"] {
|
|
44
|
+
margin: 0;
|
|
45
|
+
font: inherit;
|
|
46
|
+
font-size: 1.05rem;
|
|
47
|
+
font-weight: 700;
|
|
48
|
+
line-height: 1.25;
|
|
49
|
+
color: var(--boe-token-text-text, #222222);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
[part="description"] {
|
|
53
|
+
margin: 0;
|
|
54
|
+
font-size: 0.85rem;
|
|
55
|
+
color: var(--boe-token-text-text-secondary, #6f6f6f);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
[part="actions"] {
|
|
59
|
+
display: flex;
|
|
60
|
+
flex-wrap: wrap;
|
|
61
|
+
align-items: center;
|
|
62
|
+
gap: 0.35rem;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
[part="body"] {
|
|
66
|
+
min-inline-size: 0;
|
|
67
|
+
}
|
|
68
|
+
`;
|
|
69
|
+
/**
|
|
70
|
+
* A titled content region: an optional eyebrow, a heading, an optional
|
|
71
|
+
* description, an `actions` slot for header controls, and a default slot for
|
|
72
|
+
* content. The `<section>` is labelled by its heading via `aria-labelledby` so
|
|
73
|
+
* it is announced as a named region. Layout-only — it owns no behavior.
|
|
74
|
+
*/
|
|
75
|
+
export class BoxSectionElement extends BaseElement {
|
|
76
|
+
static get observedAttributes() {
|
|
77
|
+
return ["description", "eyebrow", "heading"];
|
|
78
|
+
}
|
|
79
|
+
headerMainEl;
|
|
80
|
+
get heading() {
|
|
81
|
+
return this.getAttribute("heading") ?? "Section";
|
|
82
|
+
}
|
|
83
|
+
set heading(value) {
|
|
84
|
+
this.setAttribute("heading", value);
|
|
85
|
+
}
|
|
86
|
+
get eyebrow() {
|
|
87
|
+
return this.getAttribute("eyebrow") ?? "";
|
|
88
|
+
}
|
|
89
|
+
set eyebrow(value) {
|
|
90
|
+
this.setAttribute("eyebrow", value);
|
|
91
|
+
}
|
|
92
|
+
get description() {
|
|
93
|
+
return this.getAttribute("description") ?? "";
|
|
94
|
+
}
|
|
95
|
+
set description(value) {
|
|
96
|
+
this.setAttribute("description", value);
|
|
97
|
+
}
|
|
98
|
+
renderTemplate() {
|
|
99
|
+
if (!this.shadowRoot) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
this.shadowRoot.innerHTML = `
|
|
103
|
+
<style>${sectionStyles}</style>
|
|
104
|
+
<section part="section" aria-labelledby="${TITLE_ID}">
|
|
105
|
+
<header part="header">
|
|
106
|
+
<div part="header-main"></div>
|
|
107
|
+
<div part="actions">
|
|
108
|
+
<slot name="actions"></slot>
|
|
109
|
+
</div>
|
|
110
|
+
</header>
|
|
111
|
+
<div part="body">
|
|
112
|
+
<slot></slot>
|
|
113
|
+
</div>
|
|
114
|
+
</section>
|
|
115
|
+
`;
|
|
116
|
+
this.headerMainEl = this.shadowRoot.querySelector('[part="header-main"]');
|
|
117
|
+
}
|
|
118
|
+
update() {
|
|
119
|
+
if (!this.headerMainEl) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const heading = this.heading;
|
|
123
|
+
const eyebrow = this.eyebrow;
|
|
124
|
+
const description = this.description;
|
|
125
|
+
const eyebrowMarkup = eyebrow ? `<span part="eyebrow">${escapeHtml(eyebrow)}</span>` : "";
|
|
126
|
+
const descriptionMarkup = description
|
|
127
|
+
? `<p part="description">${escapeHtml(description)}</p>`
|
|
128
|
+
: "";
|
|
129
|
+
this.headerMainEl.innerHTML = `
|
|
130
|
+
${eyebrowMarkup}
|
|
131
|
+
<h2 part="title heading" id="${TITLE_ID}">${escapeHtml(heading)}</h2>
|
|
132
|
+
${descriptionMarkup}
|
|
133
|
+
`;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
export const defineBoxSectionElement = (tagName = DEFAULT_TAG_NAME) => {
|
|
137
|
+
const existingElement = customElements.get(tagName);
|
|
138
|
+
if (existingElement) {
|
|
139
|
+
return existingElement;
|
|
140
|
+
}
|
|
141
|
+
customElements.define(tagName, BoxSectionElement);
|
|
142
|
+
return BoxSectionElement;
|
|
143
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { BaseElement } from "../../core/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* A disclosure control that expands and collapses a companion `box-nav-sidebar`.
|
|
4
|
+
* It owns only its own `expanded` state and announces changes with a `toggle`
|
|
5
|
+
* event (`detail.expanded`); a host wires that to the sidebar's `collapsed`
|
|
6
|
+
* property. `controls` reflects to `aria-controls` so assistive tech can tie the
|
|
7
|
+
* button to the region it operates.
|
|
8
|
+
*/
|
|
9
|
+
export declare class BoxSidebarToggleButtonElement extends BaseElement {
|
|
10
|
+
static get observedAttributes(): string[];
|
|
11
|
+
private buttonEl;
|
|
12
|
+
get expanded(): boolean;
|
|
13
|
+
set expanded(value: boolean);
|
|
14
|
+
get disabled(): boolean;
|
|
15
|
+
set disabled(value: boolean);
|
|
16
|
+
get label(): string;
|
|
17
|
+
set label(value: string);
|
|
18
|
+
get controls(): string;
|
|
19
|
+
set controls(value: string);
|
|
20
|
+
/** Flip the expanded state and announce it, unless disabled. */
|
|
21
|
+
toggle(): void;
|
|
22
|
+
protected renderTemplate(): void;
|
|
23
|
+
protected setupListeners(): void;
|
|
24
|
+
protected update(): void;
|
|
25
|
+
}
|
|
26
|
+
export declare const defineBoxSidebarToggleButtonElement: (tagName?: string) => typeof BoxSidebarToggleButtonElement;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { BaseElement } from "../../core/index.js";
|
|
2
|
+
import { boeNeutralInteractiveStyles } from "../../foundations/tokens/index.js";
|
|
3
|
+
import { boeMotionDuration, boeMotionEasing } from "../../foundations/motion/index.js";
|
|
4
|
+
import { boeRadius } from "../../foundations/geometry/index.js";
|
|
5
|
+
const DEFAULT_TAG_NAME = "box-sidebar-toggle-button";
|
|
6
|
+
const sidebarToggleButtonStyles = `
|
|
7
|
+
:host {
|
|
8
|
+
display: inline-block;
|
|
9
|
+
color: inherit;
|
|
10
|
+
font: inherit;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
[part="button"] {
|
|
14
|
+
appearance: none;
|
|
15
|
+
display: inline-flex;
|
|
16
|
+
align-items: center;
|
|
17
|
+
justify-content: center;
|
|
18
|
+
inline-size: 2.1rem;
|
|
19
|
+
block-size: 2.1rem;
|
|
20
|
+
padding: 0;
|
|
21
|
+
border: 1px solid color-mix(in srgb, var(--boe-token-stroke-stroke, #e8e8e8) 82%, transparent);
|
|
22
|
+
border-radius: ${boeRadius.control};
|
|
23
|
+
background: var(--boe-token-surface-surface, #ffffff);
|
|
24
|
+
color: var(--boe-token-text-text-secondary, #6f6f6f);
|
|
25
|
+
cursor: pointer;
|
|
26
|
+
transition: background ${boeMotionDuration.interactive} ${boeMotionEasing.standard}, border-color ${boeMotionDuration.interactive} ${boeMotionEasing.standard}, color ${boeMotionDuration.interactive} ${boeMotionEasing.standard};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
[part="button"] svg {
|
|
30
|
+
inline-size: 1.1rem;
|
|
31
|
+
block-size: 1.1rem;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
${boeNeutralInteractiveStyles('[part="button"]')}
|
|
35
|
+
|
|
36
|
+
[part="button"]:hover:not(:disabled) {
|
|
37
|
+
color: var(--boe-token-text-text, #222222);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/* Rotate the chevron to point the way the next activation will move. */
|
|
41
|
+
[part="button"][data-expanded="false"] svg {
|
|
42
|
+
transform: scaleX(-1);
|
|
43
|
+
}
|
|
44
|
+
`;
|
|
45
|
+
/**
|
|
46
|
+
* A disclosure control that expands and collapses a companion `box-nav-sidebar`.
|
|
47
|
+
* It owns only its own `expanded` state and announces changes with a `toggle`
|
|
48
|
+
* event (`detail.expanded`); a host wires that to the sidebar's `collapsed`
|
|
49
|
+
* property. `controls` reflects to `aria-controls` so assistive tech can tie the
|
|
50
|
+
* button to the region it operates.
|
|
51
|
+
*/
|
|
52
|
+
export class BoxSidebarToggleButtonElement extends BaseElement {
|
|
53
|
+
static get observedAttributes() {
|
|
54
|
+
return ["controls", "disabled", "expanded", "label"];
|
|
55
|
+
}
|
|
56
|
+
buttonEl;
|
|
57
|
+
get expanded() {
|
|
58
|
+
// Default to expanded: a sidebar renders open until the user collapses it.
|
|
59
|
+
return !this.hasAttribute("expanded") || this.getAttribute("expanded") !== "false";
|
|
60
|
+
}
|
|
61
|
+
set expanded(value) {
|
|
62
|
+
this.setAttribute("expanded", value ? "true" : "false");
|
|
63
|
+
}
|
|
64
|
+
get disabled() {
|
|
65
|
+
return this.hasAttribute("disabled");
|
|
66
|
+
}
|
|
67
|
+
set disabled(value) {
|
|
68
|
+
this.toggleAttribute("disabled", value);
|
|
69
|
+
}
|
|
70
|
+
get label() {
|
|
71
|
+
return this.getAttribute("label") ?? "Toggle sidebar";
|
|
72
|
+
}
|
|
73
|
+
set label(value) {
|
|
74
|
+
this.setAttribute("label", value);
|
|
75
|
+
}
|
|
76
|
+
get controls() {
|
|
77
|
+
return this.getAttribute("controls") ?? "";
|
|
78
|
+
}
|
|
79
|
+
set controls(value) {
|
|
80
|
+
this.setAttribute("controls", value);
|
|
81
|
+
}
|
|
82
|
+
/** Flip the expanded state and announce it, unless disabled. */
|
|
83
|
+
toggle() {
|
|
84
|
+
if (this.disabled) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
this.expanded = !this.expanded;
|
|
88
|
+
this.dispatchEvent(new CustomEvent("toggle", {
|
|
89
|
+
bubbles: true,
|
|
90
|
+
composed: true,
|
|
91
|
+
detail: { expanded: this.expanded },
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
renderTemplate() {
|
|
95
|
+
if (!this.shadowRoot) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
this.shadowRoot.innerHTML = `
|
|
99
|
+
<style>${sidebarToggleButtonStyles}</style>
|
|
100
|
+
<button type="button" part="button">
|
|
101
|
+
<svg viewBox="0 0 16 16" aria-hidden="true" focusable="false">
|
|
102
|
+
<path d="M2.5 4h11M2.5 8h11M2.5 12h7" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
|
|
103
|
+
</svg>
|
|
104
|
+
</button>
|
|
105
|
+
`;
|
|
106
|
+
this.buttonEl = this.shadowRoot.querySelector('[part="button"]');
|
|
107
|
+
}
|
|
108
|
+
setupListeners() {
|
|
109
|
+
// A native <button> turns Enter/Space into a click, so one listener covers
|
|
110
|
+
// pointer and keyboard activation.
|
|
111
|
+
this.buttonEl.addEventListener("click", () => this.toggle());
|
|
112
|
+
}
|
|
113
|
+
update() {
|
|
114
|
+
if (!this.buttonEl) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const expanded = this.expanded;
|
|
118
|
+
this.buttonEl.dataset.expanded = expanded ? "true" : "false";
|
|
119
|
+
this.buttonEl.setAttribute("aria-expanded", expanded ? "true" : "false");
|
|
120
|
+
this.buttonEl.setAttribute("aria-label", this.label);
|
|
121
|
+
if (this.controls) {
|
|
122
|
+
this.buttonEl.setAttribute("aria-controls", this.controls);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
this.buttonEl.removeAttribute("aria-controls");
|
|
126
|
+
}
|
|
127
|
+
this.buttonEl.disabled = this.disabled;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
export const defineBoxSidebarToggleButtonElement = (tagName = DEFAULT_TAG_NAME) => {
|
|
131
|
+
const existingElement = customElements.get(tagName);
|
|
132
|
+
if (existingElement) {
|
|
133
|
+
return existingElement;
|
|
134
|
+
}
|
|
135
|
+
customElements.define(tagName, BoxSidebarToggleButtonElement);
|
|
136
|
+
return BoxSidebarToggleButtonElement;
|
|
137
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { BaseElement } from "../../core/index.js";
|
|
2
|
+
export declare class BoxSplitViewElement extends BaseElement {
|
|
3
|
+
static get observedAttributes(): string[];
|
|
4
|
+
private isResizing;
|
|
5
|
+
private splitViewEl;
|
|
6
|
+
private separatorEl;
|
|
7
|
+
get label(): string;
|
|
8
|
+
set label(value: string);
|
|
9
|
+
get ratio(): number;
|
|
10
|
+
set ratio(value: number);
|
|
11
|
+
get resizable(): boolean;
|
|
12
|
+
set resizable(value: boolean);
|
|
13
|
+
private setRatioFromResize;
|
|
14
|
+
private stopResize;
|
|
15
|
+
protected renderTemplate(): void;
|
|
16
|
+
protected setupListeners(): void;
|
|
17
|
+
protected update(): void;
|
|
18
|
+
}
|
|
19
|
+
export declare const defineBoxSplitViewElement: (tagName?: string) => typeof BoxSplitViewElement;
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { BaseElement } from "../../core/index.js";
|
|
2
|
+
const DEFAULT_TAG_NAME = "box-split-view";
|
|
3
|
+
const splitViewStyles = `
|
|
4
|
+
:host {
|
|
5
|
+
display: block;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
[part="split-view"] {
|
|
9
|
+
display: grid;
|
|
10
|
+
align-items: stretch;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
[part="primary"],
|
|
14
|
+
[part="secondary"] {
|
|
15
|
+
min-width: 0;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
[part="separator"] {
|
|
19
|
+
position: relative;
|
|
20
|
+
display: grid;
|
|
21
|
+
place-items: center;
|
|
22
|
+
cursor: col-resize;
|
|
23
|
+
touch-action: none;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
[part="separator"][hidden] {
|
|
27
|
+
display: none;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
[part="separator"]::before {
|
|
31
|
+
content: "";
|
|
32
|
+
width: 1px;
|
|
33
|
+
height: 100%;
|
|
34
|
+
background: color-mix(in srgb, var(--boe-token-stroke-stroke, #e8e8e8) 82%, transparent);
|
|
35
|
+
}
|
|
36
|
+
`;
|
|
37
|
+
export class BoxSplitViewElement extends BaseElement {
|
|
38
|
+
static get observedAttributes() {
|
|
39
|
+
return ["label", "ratio", "resizable"];
|
|
40
|
+
}
|
|
41
|
+
isResizing = false;
|
|
42
|
+
splitViewEl;
|
|
43
|
+
separatorEl;
|
|
44
|
+
get label() {
|
|
45
|
+
return this.getAttribute("label") ?? "Split View";
|
|
46
|
+
}
|
|
47
|
+
set label(value) {
|
|
48
|
+
this.setAttribute("label", value);
|
|
49
|
+
}
|
|
50
|
+
get ratio() {
|
|
51
|
+
const raw = Number(this.getAttribute("ratio") ?? "0.38");
|
|
52
|
+
if (!Number.isFinite(raw)) {
|
|
53
|
+
return 0.38;
|
|
54
|
+
}
|
|
55
|
+
return Math.max(0.2, Math.min(0.8, raw));
|
|
56
|
+
}
|
|
57
|
+
set ratio(value) {
|
|
58
|
+
this.setAttribute("ratio", String(value));
|
|
59
|
+
}
|
|
60
|
+
get resizable() {
|
|
61
|
+
return this.hasAttribute("resizable");
|
|
62
|
+
}
|
|
63
|
+
set resizable(value) {
|
|
64
|
+
this.toggleAttribute("resizable", value);
|
|
65
|
+
}
|
|
66
|
+
setRatioFromResize(nextRatio) {
|
|
67
|
+
const clamped = Math.max(0.2, Math.min(0.8, nextRatio));
|
|
68
|
+
const previous = this.ratio;
|
|
69
|
+
if (previous === clamped) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
this.setAttribute("ratio", String(clamped));
|
|
73
|
+
this.dispatchEvent(new CustomEvent("ratio-changed", {
|
|
74
|
+
bubbles: true,
|
|
75
|
+
composed: true,
|
|
76
|
+
detail: { ratio: clamped },
|
|
77
|
+
}));
|
|
78
|
+
if (this.isRendered) {
|
|
79
|
+
this.update();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
stopResize(pointerId) {
|
|
83
|
+
this.isResizing = false;
|
|
84
|
+
if (typeof pointerId === "number") {
|
|
85
|
+
this.separatorEl.releasePointerCapture?.(pointerId);
|
|
86
|
+
}
|
|
87
|
+
document.body.style.cursor = "";
|
|
88
|
+
document.body.style.userSelect = "";
|
|
89
|
+
}
|
|
90
|
+
renderTemplate() {
|
|
91
|
+
if (!this.shadowRoot) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
this.shadowRoot.innerHTML = `
|
|
95
|
+
<style>${splitViewStyles}</style>
|
|
96
|
+
<section part="split-view">
|
|
97
|
+
<div part="primary">
|
|
98
|
+
<slot name="primary"></slot>
|
|
99
|
+
</div>
|
|
100
|
+
<div part="separator" role="separator" aria-orientation="vertical" aria-label="Resize panels" hidden></div>
|
|
101
|
+
<div part="secondary">
|
|
102
|
+
<slot></slot>
|
|
103
|
+
</div>
|
|
104
|
+
</section>
|
|
105
|
+
`;
|
|
106
|
+
this.splitViewEl = this.shadowRoot.querySelector('[part="split-view"]');
|
|
107
|
+
this.separatorEl = this.shadowRoot.querySelector('[part="separator"]');
|
|
108
|
+
}
|
|
109
|
+
setupListeners() {
|
|
110
|
+
this.separatorEl.addEventListener("pointerdown", event => {
|
|
111
|
+
const pointerEvent = event;
|
|
112
|
+
this.isResizing = true;
|
|
113
|
+
this.separatorEl.setPointerCapture?.(pointerEvent.pointerId);
|
|
114
|
+
document.body.style.cursor = "col-resize";
|
|
115
|
+
document.body.style.userSelect = "none";
|
|
116
|
+
});
|
|
117
|
+
this.separatorEl.addEventListener("pointermove", event => {
|
|
118
|
+
const pointerEvent = event;
|
|
119
|
+
if (!this.isResizing) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const rect = this.getBoundingClientRect();
|
|
123
|
+
if (!rect.width) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const nextRatio = Math.max(0.2, Math.min(0.8, (pointerEvent.clientX - rect.left) / rect.width));
|
|
127
|
+
this.setRatioFromResize(nextRatio);
|
|
128
|
+
});
|
|
129
|
+
this.separatorEl.addEventListener("pointerup", event => {
|
|
130
|
+
this.stopResize(event.pointerId);
|
|
131
|
+
});
|
|
132
|
+
this.separatorEl.addEventListener("pointercancel", event => {
|
|
133
|
+
this.stopResize(event.pointerId);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
update() {
|
|
137
|
+
if (!this.splitViewEl || !this.separatorEl) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const ratioPercent = `${Math.round(this.ratio * 100)}%`;
|
|
141
|
+
const resizable = this.resizable;
|
|
142
|
+
const splitColumns = resizable
|
|
143
|
+
? `minmax(180px, ${ratioPercent}) 12px minmax(0, 1fr)`
|
|
144
|
+
: `minmax(180px, ${ratioPercent}) minmax(0, 1fr)`;
|
|
145
|
+
this.splitViewEl.style.gridTemplateColumns = splitColumns;
|
|
146
|
+
this.splitViewEl.setAttribute("aria-label", this.label);
|
|
147
|
+
this.separatorEl.hidden = !resizable;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
export const defineBoxSplitViewElement = (tagName = DEFAULT_TAG_NAME) => {
|
|
151
|
+
const existingElement = customElements.get(tagName);
|
|
152
|
+
if (existingElement) {
|
|
153
|
+
return existingElement;
|
|
154
|
+
}
|
|
155
|
+
customElements.define(tagName, BoxSplitViewElement);
|
|
156
|
+
return BoxSplitViewElement;
|
|
157
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { BaseElement } from "../../core/index.js";
|
|
2
|
+
type BoxAccordionItem = {
|
|
3
|
+
content?: string;
|
|
4
|
+
label: string;
|
|
5
|
+
value: string;
|
|
6
|
+
};
|
|
7
|
+
export declare class BoxAccordionElement extends BaseElement {
|
|
8
|
+
static get observedAttributes(): string[];
|
|
9
|
+
private valueInternal;
|
|
10
|
+
private lastItemsJson;
|
|
11
|
+
private accordionEl;
|
|
12
|
+
get label(): string;
|
|
13
|
+
set label(value: string);
|
|
14
|
+
get items(): BoxAccordionItem[];
|
|
15
|
+
set items(value: BoxAccordionItem[]);
|
|
16
|
+
get value(): string;
|
|
17
|
+
set value(nextValue: string);
|
|
18
|
+
attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null): void;
|
|
19
|
+
private renderItemsMarkup;
|
|
20
|
+
protected renderTemplate(): void;
|
|
21
|
+
protected setupListeners(): void;
|
|
22
|
+
protected update(): void;
|
|
23
|
+
}
|
|
24
|
+
export declare const defineBoxAccordionElement: (tagName?: string) => typeof BoxAccordionElement;
|
|
25
|
+
export {};
|