@panphora/bevel 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 +16 -0
- package/README.md +226 -0
- package/bevel-fonts.css +16 -0
- package/bevel.css +3075 -0
- package/bevel.js +2126 -0
- package/dist/react/components/activity-feed.d.ts +89 -0
- package/dist/react/components/activity-feed.js +54 -0
- package/dist/react/components/alert-dialog.d.ts +14 -0
- package/dist/react/components/alert-dialog.js +19 -0
- package/dist/react/components/app-shell.d.ts +98 -0
- package/dist/react/components/app-shell.js +86 -0
- package/dist/react/components/app-toolbar.d.ts +19 -0
- package/dist/react/components/app-toolbar.js +22 -0
- package/dist/react/components/avatar-group.d.ts +67 -0
- package/dist/react/components/avatar-group.js +49 -0
- package/dist/react/components/badge-and-pill.d.ts +34 -0
- package/dist/react/components/badge-and-pill.js +12 -0
- package/dist/react/components/breadcrumbs.d.ts +56 -0
- package/dist/react/components/breadcrumbs.js +44 -0
- package/dist/react/components/bulk-bar.d.ts +22 -0
- package/dist/react/components/bulk-bar.js +59 -0
- package/dist/react/components/button.d.ts +15 -0
- package/dist/react/components/button.js +20 -0
- package/dist/react/components/callout-and-hint.d.ts +17 -0
- package/dist/react/components/callout-and-hint.js +8 -0
- package/dist/react/components/checkbox.d.ts +5 -0
- package/dist/react/components/checkbox.js +13 -0
- package/dist/react/components/chip.d.ts +149 -0
- package/dist/react/components/chip.js +29 -0
- package/dist/react/components/code-block.d.ts +50 -0
- package/dist/react/components/code-block.js +77 -0
- package/dist/react/components/code-editor.d.ts +122 -0
- package/dist/react/components/code-editor.js +695 -0
- package/dist/react/components/column-manager.d.ts +28 -0
- package/dist/react/components/column-manager.js +85 -0
- package/dist/react/components/combobox.d.ts +32 -0
- package/dist/react/components/combobox.js +37 -0
- package/dist/react/components/data-grid.d.ts +108 -0
- package/dist/react/components/data-grid.js +159 -0
- package/dist/react/components/data-table.d.ts +2 -0
- package/dist/react/components/data-table.js +6 -0
- package/dist/react/components/date.d.ts +23 -0
- package/dist/react/components/date.js +11 -0
- package/dist/react/components/details.d.ts +13 -0
- package/dist/react/components/details.js +20 -0
- package/dist/react/components/dialog.d.ts +74 -0
- package/dist/react/components/dialog.js +31 -0
- package/dist/react/components/diff-view.d.ts +73 -0
- package/dist/react/components/diff-view.js +68 -0
- package/dist/react/components/documents.d.ts +70 -0
- package/dist/react/components/documents.js +10 -0
- package/dist/react/components/drawer.d.ts +45 -0
- package/dist/react/components/drawer.js +35 -0
- package/dist/react/components/editable-grid-cells.d.ts +32 -0
- package/dist/react/components/editable-grid-cells.js +116 -0
- package/dist/react/components/eyebrow-kicker-lede-pull-quote.d.ts +39 -0
- package/dist/react/components/eyebrow-kicker-lede-pull-quote.js +12 -0
- package/dist/react/components/field.d.ts +32 -0
- package/dist/react/components/field.js +27 -0
- package/dist/react/components/file-tree.d.ts +75 -0
- package/dist/react/components/file-tree.js +247 -0
- package/dist/react/components/file.d.ts +43 -0
- package/dist/react/components/file.js +73 -0
- package/dist/react/components/files-table.d.ts +174 -0
- package/dist/react/components/files-table.js +237 -0
- package/dist/react/components/filter-builder.d.ts +37 -0
- package/dist/react/components/filter-builder.js +109 -0
- package/dist/react/components/form-error-summary.d.ts +16 -0
- package/dist/react/components/form-error-summary.js +49 -0
- package/dist/react/components/icon-button.d.ts +8 -0
- package/dist/react/components/icon-button.js +14 -0
- package/dist/react/components/icon.d.ts +7 -0
- package/dist/react/components/icon.js +15 -0
- package/dist/react/components/image.d.ts +72 -0
- package/dist/react/components/image.js +24 -0
- package/dist/react/components/inline-edit.d.ts +70 -0
- package/dist/react/components/inline-edit.js +149 -0
- package/dist/react/components/input.d.ts +29 -0
- package/dist/react/components/input.js +20 -0
- package/dist/react/components/kanban-board.d.ts +140 -0
- package/dist/react/components/kanban-board.js +374 -0
- package/dist/react/components/layout.d.ts +51 -0
- package/dist/react/components/layout.js +28 -0
- package/dist/react/components/list.d.ts +28 -0
- package/dist/react/components/list.js +6 -0
- package/dist/react/components/masthead-and-verdict.d.ts +60 -0
- package/dist/react/components/masthead-and-verdict.js +8 -0
- package/dist/react/components/menu.d.ts +26 -0
- package/dist/react/components/menu.js +31 -0
- package/dist/react/components/multi-select-picker.d.ts +49 -0
- package/dist/react/components/multi-select-picker.js +20 -0
- package/dist/react/components/note.d.ts +33 -0
- package/dist/react/components/note.js +8 -0
- package/dist/react/components/number-field.d.ts +16 -0
- package/dist/react/components/number-field.js +17 -0
- package/dist/react/components/pagination.d.ts +45 -0
- package/dist/react/components/pagination.js +87 -0
- package/dist/react/components/persistent-action-banner.d.ts +71 -0
- package/dist/react/components/persistent-action-banner.js +39 -0
- package/dist/react/components/popconfirm.d.ts +42 -0
- package/dist/react/components/popconfirm.js +59 -0
- package/dist/react/components/popover.d.ts +16 -0
- package/dist/react/components/popover.js +21 -0
- package/dist/react/components/progress-and-gauge.d.ts +44 -0
- package/dist/react/components/progress-and-gauge.js +19 -0
- package/dist/react/components/radio.d.ts +7 -0
- package/dist/react/components/radio.js +13 -0
- package/dist/react/components/rich-text-toolbar.d.ts +26 -0
- package/dist/react/components/rich-text-toolbar.js +64 -0
- package/dist/react/components/rows-and-card.d.ts +88 -0
- package/dist/react/components/rows-and-card.js +10 -0
- package/dist/react/components/save-status-indicator.d.ts +11 -0
- package/dist/react/components/save-status-indicator.js +33 -0
- package/dist/react/components/segmented-control.d.ts +21 -0
- package/dist/react/components/segmented-control.js +15 -0
- package/dist/react/components/select.d.ts +29 -0
- package/dist/react/components/select.js +29 -0
- package/dist/react/components/selectable-cards.d.ts +30 -0
- package/dist/react/components/selectable-cards.js +29 -0
- package/dist/react/components/settings-rows.d.ts +51 -0
- package/dist/react/components/settings-rows.js +8 -0
- package/dist/react/components/sidebar-nav.d.ts +77 -0
- package/dist/react/components/sidebar-nav.js +41 -0
- package/dist/react/components/skeleton-and-empty.d.ts +51 -0
- package/dist/react/components/skeleton-and-empty.js +14 -0
- package/dist/react/components/slider.d.ts +19 -0
- package/dist/react/components/slider.js +17 -0
- package/dist/react/components/small-charts.d.ts +60 -0
- package/dist/react/components/small-charts.js +76 -0
- package/dist/react/components/sortable.d.ts +30 -0
- package/dist/react/components/sortable.js +85 -0
- package/dist/react/components/split-button.d.ts +38 -0
- package/dist/react/components/split-button.js +43 -0
- package/dist/react/components/split-panes.d.ts +35 -0
- package/dist/react/components/split-panes.js +102 -0
- package/dist/react/components/stat-tiles.d.ts +54 -0
- package/dist/react/components/stat-tiles.js +8 -0
- package/dist/react/components/steps.d.ts +11 -0
- package/dist/react/components/steps.js +13 -0
- package/dist/react/components/switch.d.ts +6 -0
- package/dist/react/components/switch.js +13 -0
- package/dist/react/components/table.d.ts +61 -0
- package/dist/react/components/table.js +6 -0
- package/dist/react/components/tabs.d.ts +7 -0
- package/dist/react/components/tabs.js +13 -0
- package/dist/react/components/tags.d.ts +33 -0
- package/dist/react/components/tags.js +83 -0
- package/dist/react/components/textarea.d.ts +10 -0
- package/dist/react/components/textarea.js +6 -0
- package/dist/react/components/toast.d.ts +35 -0
- package/dist/react/components/toast.js +90 -0
- package/dist/react/components/tooltip-and-key.d.ts +20 -0
- package/dist/react/components/tooltip-and-key.js +20 -0
- package/dist/react/components/tree-view.d.ts +34 -0
- package/dist/react/components/tree-view.js +118 -0
- package/dist/react/components/upload-dropzone.d.ts +92 -0
- package/dist/react/components/upload-dropzone.js +116 -0
- package/dist/react/components/wizard-shell.d.ts +78 -0
- package/dist/react/components/wizard-shell.js +176 -0
- package/dist/react/fonts.css.d.ts +1 -0
- package/dist/react/index.d.ts +76 -0
- package/dist/react/index.js +77 -0
- package/dist/react/integrations/quickcrop.d.ts +58 -0
- package/dist/react/integrations/quickcrop.js +137 -0
- package/dist/react/integrations/richclay.d.ts +43 -0
- package/dist/react/integrations/richclay.js +129 -0
- package/dist/react/internal/classes.d.ts +3 -0
- package/dist/react/internal/classes.js +10 -0
- package/dist/react/internal/close-mark.d.ts +1 -0
- package/dist/react/internal/close-mark.js +10 -0
- package/dist/react/internal/controllable-state.d.ts +9 -0
- package/dist/react/internal/controllable-state.js +22 -0
- package/dist/react/internal/drop-effect.d.ts +28 -0
- package/dist/react/internal/drop-effect.js +8 -0
- package/dist/react/internal/form-reset.d.ts +2 -0
- package/dist/react/internal/form-reset.js +22 -0
- package/dist/react/internal/format.d.ts +1 -0
- package/dist/react/internal/format.js +14 -0
- package/dist/react/internal/link.d.ts +2 -0
- package/dist/react/internal/link.js +8 -0
- package/dist/react/internal/part.d.ts +20 -0
- package/dist/react/internal/part.js +47 -0
- package/dist/react/internal/pointer-session.d.ts +8 -0
- package/dist/react/internal/pointer-session.js +60 -0
- package/dist/react/internal/refs.d.ts +2 -0
- package/dist/react/internal/refs.js +22 -0
- package/dist/react/internal/rich-text.d.ts +28 -0
- package/dist/react/internal/rich-text.js +4 -0
- package/dist/react/internal/table-context.d.ts +39 -0
- package/dist/react/internal/table-context.js +12 -0
- package/dist/react/internal/use-object-url.d.ts +1 -0
- package/dist/react/internal/use-object-url.js +15 -0
- package/dist/react/layout.css +274 -0
- package/dist/react/layout.css.d.ts +1 -0
- package/dist/react/models/filter.d.ts +31 -0
- package/dist/react/models/filter.js +79 -0
- package/dist/react/models/kanban.d.ts +51 -0
- package/dist/react/models/kanban.js +35 -0
- package/dist/react/models/reorder.d.ts +9 -0
- package/dist/react/models/reorder.js +23 -0
- package/dist/react/models/table.d.ts +85 -0
- package/dist/react/models/table.js +144 -0
- package/dist/react/models/tree.d.ts +16 -0
- package/dist/react/models/tree.js +26 -0
- package/dist/react/provider.d.ts +18 -0
- package/dist/react/provider.js +31 -0
- package/dist/react/recipes/context-hypercms.d.ts +17 -0
- package/dist/react/recipes/context-hypercms.js +71 -0
- package/dist/react/recipes/context-quickcrop.d.ts +8 -0
- package/dist/react/recipes/context-quickcrop.js +49 -0
- package/dist/react/theme.css +8004 -0
- package/dist/react/theme.css.d.ts +1 -0
- package/examples/README.md +34 -0
- package/examples/components/activity-feed.html +28 -0
- package/examples/components/app-shell.html +12 -0
- package/examples/components/app-toolbar.html +38 -0
- package/examples/components/avatar-group.html +27 -0
- package/examples/components/breadcrumbs.html +26 -0
- package/examples/components/bulk-bar.html +22 -0
- package/examples/components/code-block.html +12 -0
- package/examples/components/code-editor.html +25 -0
- package/examples/components/column-manager.html +9 -0
- package/examples/components/combobox.html +13 -0
- package/examples/components/context-hypercms.css +41 -0
- package/examples/components/context-hypercms.html +40 -0
- package/examples/components/context-hypercms.js +62 -0
- package/examples/components/context-quickcrop.html +137 -0
- package/examples/components/diff-view.html +9 -0
- package/examples/components/drawer.html +11 -0
- package/examples/components/editable-grid-cells.html +9 -0
- package/examples/components/file-browser.html +53 -0
- package/examples/components/file-tree.html +34 -0
- package/examples/components/files-table.html +80 -0
- package/examples/components/filter-builder.html +11 -0
- package/examples/components/form-error-summary.html +11 -0
- package/examples/components/index.html +51 -0
- package/examples/components/inline-edit.html +42 -0
- package/examples/components/kanban-board.html +42 -0
- package/examples/components/manifest.json +3279 -0
- package/examples/components/modal.html +11 -0
- package/examples/components/multi-select-picker.html +13 -0
- package/examples/components/pagination.html +32 -0
- package/examples/components/persistent-action-banner.html +23 -0
- package/examples/components/popconfirm.html +13 -0
- package/examples/components/popover-menu.html +13 -0
- package/examples/components/reference/baseline/DECISIONS.md +85 -0
- package/examples/components/reference/baseline/README.md +58 -0
- package/examples/components/reference/baseline/bevel-fonts.css +16 -0
- package/examples/components/reference/baseline/bevel.css +1339 -0
- package/examples/components/reference/baseline/bevel.js +496 -0
- package/examples/components/reference/baseline/fonts/LICENSE-ibm-plex-mono.txt +93 -0
- package/examples/components/reference/baseline/fonts/LICENSE-ibm-plex-sans.txt +93 -0
- package/examples/components/reference/baseline/fonts/LICENSE-newsreader.txt +93 -0
- package/examples/components/reference/baseline/fonts/ibm-plex-mono-latin-400-normal.woff2 +0 -0
- package/examples/components/reference/baseline/fonts/ibm-plex-mono-latin-500-normal.woff2 +0 -0
- package/examples/components/reference/baseline/fonts/ibm-plex-mono-latin-600-normal.woff2 +0 -0
- package/examples/components/reference/baseline/fonts/ibm-plex-sans-latin-400-italic.woff2 +0 -0
- package/examples/components/reference/baseline/fonts/ibm-plex-sans-latin-400-normal.woff2 +0 -0
- package/examples/components/reference/baseline/fonts/ibm-plex-sans-latin-500-normal.woff2 +0 -0
- package/examples/components/reference/baseline/fonts/ibm-plex-sans-latin-600-normal.woff2 +0 -0
- package/examples/components/reference/baseline/fonts/newsreader-latin-opsz-italic.woff2 +0 -0
- package/examples/components/reference/baseline/fonts/newsreader-latin-opsz-normal.woff2 +0 -0
- package/examples/components/reference/fable/IMPROVEMENTS.md +106 -0
- package/examples/components/reference/fable/PARENT-REPAIRS.md +17 -0
- package/examples/components/reference/fable/__pycache__/build_repairs.cpython-311.pyc +0 -0
- package/examples/components/reference/fable/__pycache__/kanban.cpython-311.pyc +0 -0
- package/examples/components/reference/fable/as-authored/IMPROVEMENTS-completed.md +106 -0
- package/examples/components/reference/fable/as-authored/base-astra.css +17 -0
- package/examples/components/reference/fable/as-authored/base-parent.css +416 -0
- package/examples/components/reference/fable/as-authored/build.py +858 -0
- package/examples/components/reference/fable/as-authored/fable.css +823 -0
- package/examples/components/reference/fable/as-authored/kanban-completed.css +235 -0
- package/examples/components/reference/fable/as-authored/kanban-completed.html +53 -0
- package/examples/components/reference/fable/as-authored/kanban-completed.py +212 -0
- package/examples/components/reference/fable/as-authored/kanban.py +207 -0
- package/examples/components/reference/fable/base-astra.css +17 -0
- package/examples/components/reference/fable/base-parent.css +416 -0
- package/examples/components/reference/fable/build.py +858 -0
- package/examples/components/reference/fable/build_repairs.py +25 -0
- package/examples/components/reference/fable/components/activity-feed.html +3 -0
- package/examples/components/reference/fable/components/app-toolbar.html +3 -0
- package/examples/components/reference/fable/components/avatar-group.html +4 -0
- package/examples/components/reference/fable/components/breadcrumbs.html +3 -0
- package/examples/components/reference/fable/components/code-block.html +9 -0
- package/examples/components/reference/fable/components/column-manager.html +3 -0
- package/examples/components/reference/fable/components/combobox.html +6 -0
- package/examples/components/reference/fable/components/context-hypercms.html +3 -0
- package/examples/components/reference/fable/components/context-quickcrop.html +4 -0
- package/examples/components/reference/fable/components/diff-view.html +13 -0
- package/examples/components/reference/fable/components/drawer.html +3 -0
- package/examples/components/reference/fable/components/editable-grid-cells.html +3 -0
- package/examples/components/reference/fable/components/filter-builder.html +3 -0
- package/examples/components/reference/fable/components/form-error-summary.html +4 -0
- package/examples/components/reference/fable/components/inline-edit.html +3 -0
- package/examples/components/reference/fable/components/kanban-board.html +53 -0
- package/examples/components/reference/fable/components/modal.html +3 -0
- package/examples/components/reference/fable/components/multi-select-picker.html +5 -0
- package/examples/components/reference/fable/components/pagination.html +3 -0
- package/examples/components/reference/fable/components/persistent-action-banner.html +4 -0
- package/examples/components/reference/fable/components/popconfirm.html +5 -0
- package/examples/components/reference/fable/components/popover-menu.html +3 -0
- package/examples/components/reference/fable/components/rich-text-toolbar.html +3 -0
- package/examples/components/reference/fable/components/save-status-indicator.html +2 -0
- package/examples/components/reference/fable/components/selectable-cards.html +3 -0
- package/examples/components/reference/fable/components/settings-rows.html +3 -0
- package/examples/components/reference/fable/components/sidebar-nav.html +4 -0
- package/examples/components/reference/fable/components/small-charts.html +5 -0
- package/examples/components/reference/fable/components/split-button.html +4 -0
- package/examples/components/reference/fable/components/split-panes.html +8 -0
- package/examples/components/reference/fable/components/stat-tiles.html +3 -0
- package/examples/components/reference/fable/components/toast-stack.html +5 -0
- package/examples/components/reference/fable/components/tree-view.html +4 -0
- package/examples/components/reference/fable/components/upload-dropzone.html +6 -0
- package/examples/components/reference/fable/components/wizard-shell.html +3 -0
- package/examples/components/reference/fable/coverage.json +414 -0
- package/examples/components/reference/fable/fable.css +823 -0
- package/examples/components/reference/fable/index.html +5 -0
- package/examples/components/reference/fable/kanban.css +237 -0
- package/examples/components/reference/fable/kanban.py +212 -0
- package/examples/components/reference/fable/parent-repairs.css +9 -0
- package/examples/components/reference/fixtures/data.json +102 -0
- package/examples/components/reference/fixtures/host.js +47 -0
- package/examples/components/reference/fixtures/static-host.js +39 -0
- package/examples/components/reference/fixtures/workspace.jpg +0 -0
- package/examples/components/reference/parent/CHANGES.md +179 -0
- package/examples/components/reference/parent/__pycache__/kanban.cpython-311.pyc +0 -0
- package/examples/components/reference/parent/base-astra.css +17 -0
- package/examples/components/reference/parent/base-parent.css +416 -0
- package/examples/components/reference/parent/build.py +148 -0
- package/examples/components/reference/parent/components/activity-feed.html +2 -0
- package/examples/components/reference/parent/components/app-toolbar.html +2 -0
- package/examples/components/reference/parent/components/avatar-group.html +4 -0
- package/examples/components/reference/parent/components/breadcrumbs.html +2 -0
- package/examples/components/reference/parent/components/code-block.html +8 -0
- package/examples/components/reference/parent/components/column-manager.html +2 -0
- package/examples/components/reference/parent/components/combobox.html +6 -0
- package/examples/components/reference/parent/components/context-hypercms.html +2 -0
- package/examples/components/reference/parent/components/context-quickcrop.html +4 -0
- package/examples/components/reference/parent/components/diff-view.html +4 -0
- package/examples/components/reference/parent/components/drawer.html +2 -0
- package/examples/components/reference/parent/components/editable-grid-cells.html +2 -0
- package/examples/components/reference/parent/components/filter-builder.html +2 -0
- package/examples/components/reference/parent/components/form-error-summary.html +2 -0
- package/examples/components/reference/parent/components/inline-edit.html +2 -0
- package/examples/components/reference/parent/components/kanban-board.html +84 -0
- package/examples/components/reference/parent/components/modal.html +2 -0
- package/examples/components/reference/parent/components/multi-select-picker.html +5 -0
- package/examples/components/reference/parent/components/pagination.html +2 -0
- package/examples/components/reference/parent/components/persistent-action-banner.html +4 -0
- package/examples/components/reference/parent/components/popconfirm.html +5 -0
- package/examples/components/reference/parent/components/popover-menu.html +2 -0
- package/examples/components/reference/parent/components/rich-text-toolbar.html +2 -0
- package/examples/components/reference/parent/components/save-status-indicator.html +2 -0
- package/examples/components/reference/parent/components/selectable-cards.html +2 -0
- package/examples/components/reference/parent/components/settings-rows.html +2 -0
- package/examples/components/reference/parent/components/sidebar-nav.html +4 -0
- package/examples/components/reference/parent/components/small-charts.html +2 -0
- package/examples/components/reference/parent/components/split-button.html +5 -0
- package/examples/components/reference/parent/components/split-panes.html +8 -0
- package/examples/components/reference/parent/components/stat-tiles.html +2 -0
- package/examples/components/reference/parent/components/toast-stack.html +5 -0
- package/examples/components/reference/parent/components/tree-view.html +4 -0
- package/examples/components/reference/parent/components/upload-dropzone.html +6 -0
- package/examples/components/reference/parent/components/wizard-shell.html +2 -0
- package/examples/components/reference/parent/coverage.json +414 -0
- package/examples/components/reference/parent/index.html +1 -0
- package/examples/components/reference/parent/kanban.css +114 -0
- package/examples/components/reference/parent/kanban.py +55 -0
- package/examples/components/reference/parent/refinement.css +53 -0
- package/examples/components/reference/selected/build.py +70 -0
- package/examples/components/reference/selected/components/activity-feed.html +3 -0
- package/examples/components/reference/selected/components/app-toolbar.html +3 -0
- package/examples/components/reference/selected/components/avatar-group.html +4 -0
- package/examples/components/reference/selected/components/breadcrumbs.html +3 -0
- package/examples/components/reference/selected/components/code-block.html +9 -0
- package/examples/components/reference/selected/components/column-manager.html +3 -0
- package/examples/components/reference/selected/components/combobox.html +6 -0
- package/examples/components/reference/selected/components/context-hypercms.html +3 -0
- package/examples/components/reference/selected/components/context-quickcrop.html +4 -0
- package/examples/components/reference/selected/components/diff-view.html +13 -0
- package/examples/components/reference/selected/components/drawer.html +3 -0
- package/examples/components/reference/selected/components/editable-grid-cells.html +3 -0
- package/examples/components/reference/selected/components/filter-builder.html +3 -0
- package/examples/components/reference/selected/components/form-error-summary.html +4 -0
- package/examples/components/reference/selected/components/inline-edit.html +3 -0
- package/examples/components/reference/selected/components/kanban-board.html +53 -0
- package/examples/components/reference/selected/components/modal.html +2 -0
- package/examples/components/reference/selected/components/multi-select-picker.html +5 -0
- package/examples/components/reference/selected/components/pagination.html +3 -0
- package/examples/components/reference/selected/components/persistent-action-banner.html +4 -0
- package/examples/components/reference/selected/components/popconfirm.html +5 -0
- package/examples/components/reference/selected/components/popover-menu.html +3 -0
- package/examples/components/reference/selected/components/rich-text-toolbar.html +3 -0
- package/examples/components/reference/selected/components/save-status-indicator.html +2 -0
- package/examples/components/reference/selected/components/selectable-cards.html +3 -0
- package/examples/components/reference/selected/components/settings-rows.html +3 -0
- package/examples/components/reference/selected/components/sidebar-nav.html +4 -0
- package/examples/components/reference/selected/components/small-charts.html +5 -0
- package/examples/components/reference/selected/components/split-button.html +4 -0
- package/examples/components/reference/selected/components/split-panes.html +8 -0
- package/examples/components/reference/selected/components/stat-tiles.html +3 -0
- package/examples/components/reference/selected/components/toast-stack.html +5 -0
- package/examples/components/reference/selected/components/tree-view.html +4 -0
- package/examples/components/reference/selected/components/upload-dropzone.html +6 -0
- package/examples/components/reference/selected/components/wizard-shell.html +3 -0
- package/examples/components/reference/selected/corrections.css +11 -0
- package/examples/components/reference/selected/coverage.json +413 -0
- package/examples/components/reference/selected/gallery-build.mjs +49 -0
- package/examples/components/reference/selected/gallery-spec.json +12 -0
- package/examples/components/reference/selected/index.html +1 -0
- package/examples/components/reference/selected/kanban-comparison.json +6 -0
- package/examples/components/reference/selected/manifest.json +476 -0
- package/examples/components/reference/sha256.json +142 -0
- package/examples/components/reference/sources/diagonal-close.svg +1 -0
- package/examples/components/reference/sources/hyperclay/public-assets/css/hyperclay-app-source.css +614 -0
- package/examples/components/reference/sources/hyperclay/public-assets/js/app.js +94 -0
- package/examples/components/reference/sources/hyperclayjs/src/ui/theModal.js +897 -0
- package/examples/components/reference/sources/hypercms/scripts/build-theme.js +203 -0
- package/examples/components/reference/sources/hypercms/src/anchor.js +24 -0
- package/examples/components/reference/sources/hypercms/src/apply-loop.js +167 -0
- package/examples/components/reference/sources/hypercms/src/diagnostics.js +44 -0
- package/examples/components/reference/sources/hypercms/src/enhance.js +173 -0
- package/examples/components/reference/sources/hypercms/src/events.js +955 -0
- package/examples/components/reference/sources/hypercms/src/form-builder.js +518 -0
- package/examples/components/reference/sources/hypercms/src/form-rules.js +208 -0
- package/examples/components/reference/sources/hypercms/src/hooks.js +100 -0
- package/examples/components/reference/sources/hypercms/src/hypercms-bundle.js +10 -0
- package/examples/components/reference/sources/hypercms/src/hypercms.js +347 -0
- package/examples/components/reference/sources/hypercms/src/morph.js +10 -0
- package/examples/components/reference/sources/hypercms/src/path.js +61 -0
- package/examples/components/reference/sources/hypercms/src/place.js +131 -0
- package/examples/components/reference/sources/hypercms/src/platform.js +131 -0
- package/examples/components/reference/sources/hypercms/src/refresh.js +87 -0
- package/examples/components/reference/sources/hypercms/src/richclay-bridge.js +140 -0
- package/examples/components/reference/sources/hypercms/src/row-identity.js +111 -0
- package/examples/components/reference/sources/hypercms/src/scaffold.js +10 -0
- package/examples/components/reference/sources/hypercms/src/session.js +303 -0
- package/examples/components/reference/sources/hypercms/src/shell.js +248 -0
- package/examples/components/reference/sources/hypercms/src/styles.css +298 -0
- package/examples/components/reference/sources/hypercms/src/targets.js +144 -0
- package/examples/components/reference/sources/hypercms/src/templates.js +656 -0
- package/examples/components/reference/sources/hypercms/src/theme/pixel-quiet.overrides.css +761 -0
- package/examples/components/reference/sources/hypercms/src/theme.generated.css +1772 -0
- package/examples/components/reference/sources/hypercms/src/toggle.js +666 -0
- package/examples/components/reference/sources/hypercms/src/unresolved.js +211 -0
- package/examples/components/reference/sources/hypercms/src/vendor/mirk.vendor.js +212 -0
- package/examples/components/reference/sources/hypercms/src/views/inline-layer.js +421 -0
- package/examples/components/reference/sources/hypercms/src/views/inline.js +1072 -0
- package/examples/components/reference/sources/hypercms/src/views/sidebar.js +97 -0
- package/examples/components/reference/sources/modal-reference.html +301 -0
- package/examples/components/reference/sources/quickcrop/quickcrop.css +124 -0
- package/examples/components/reference/sources/quickcrop/quickcrop.js +400 -0
- package/examples/components/reference/sources/richclay/richclay.css +416 -0
- package/examples/components/reference/sources/richclay/richclay.js +2962 -0
- package/examples/components/reference/sources/richclay/src/a11y.js +67 -0
- package/examples/components/reference/sources/richclay/src/browser-global.js +7 -0
- package/examples/components/reference/sources/richclay/src/buttons.js +254 -0
- package/examples/components/reference/sources/richclay/src/hyperclay.js +470 -0
- package/examples/components/reference/sources/richclay/src/normalize.js +380 -0
- package/examples/components/reference/sources/richclay/src/richclay.js +1356 -0
- package/examples/components/reference/sources/richclay/src/sanitize.js +189 -0
- package/examples/components/reference/sources/richclay/src/styles.js +23 -0
- package/examples/components/reference/sources/richclay/src/toolbar-float.js +175 -0
- package/examples/components/reference/sources/richclay/src/toolbar.js +394 -0
- package/examples/components/reference/sources/richclay/src/vendor-bundle.js +15 -0
- package/examples/components/reference/sources/richclay/vendor/DOMPURIFY-LICENSE +202 -0
- package/examples/components/reference/sources/richclay/vendor/DOMPURIFY-LICENSE-MPL +373 -0
- package/examples/components/reference/sources/richclay/vendor/SQUIRE-LICENSE +21 -0
- package/examples/components/reference/sources/richclay/vendor/purify.es.mjs +2249 -0
- package/examples/components/reference/sources/richclay/vendor/purify.min.js +3 -0
- package/examples/components/reference/sources/richclay/vendor/squire.js +22 -0
- package/examples/components/reference/sources/richclay/vendor/squire.mjs +22 -0
- package/examples/components/reference/sources/richclay/vendor/squire.provenance.json +19 -0
- package/examples/components/rich-text-toolbar.html +43 -0
- package/examples/components/save-status-indicator.html +11 -0
- package/examples/components/selectable-cards.html +9 -0
- package/examples/components/settings-rows.html +10 -0
- package/examples/components/sidebar-nav.html +9 -0
- package/examples/components/small-charts.html +21 -0
- package/examples/components/split-button.html +13 -0
- package/examples/components/split-panes-editor.html +6 -0
- package/examples/components/split-panes.html +9 -0
- package/examples/components/stat-tiles.html +23 -0
- package/examples/components/toast-stack.html +21 -0
- package/examples/components/tree-view.html +9 -0
- package/examples/components/upload-dropzone.html +88 -0
- package/examples/components/wizard-shell.html +50 -0
- package/examples/datastar/index.html +38 -0
- package/examples/datastar/server.mjs +31 -0
- package/examples/fixtures/field-guide.pdf +14 -0
- package/examples/fixtures/workspace.jpg +0 -0
- package/examples/setup-peers.mjs +35 -0
- package/fonts/LICENSE-ibm-plex-mono.txt +93 -0
- package/fonts/LICENSE-ibm-plex-sans.txt +93 -0
- package/fonts/LICENSE-newsreader.txt +93 -0
- package/fonts/ibm-plex-mono-latin-400-normal.woff2 +0 -0
- package/fonts/ibm-plex-mono-latin-500-normal.woff2 +0 -0
- package/fonts/ibm-plex-mono-latin-600-normal.woff2 +0 -0
- package/fonts/ibm-plex-sans-latin-400-italic.woff2 +0 -0
- package/fonts/ibm-plex-sans-latin-400-normal.woff2 +0 -0
- package/fonts/ibm-plex-sans-latin-500-normal.woff2 +0 -0
- package/fonts/ibm-plex-sans-latin-600-normal.woff2 +0 -0
- package/fonts/newsreader-latin-opsz-italic.woff2 +0 -0
- package/fonts/newsreader-latin-opsz-normal.woff2 +0 -0
- package/icons/LICENSE +21 -0
- package/icons/house.json +71 -0
- package/icons/icons.d.ts +17 -0
- package/icons/icons.js +648 -0
- package/icons/icons.svg +126 -0
- package/icons/marks/build-tray.source.mjs +45 -0
- package/icons/marks/hyperclay-local.svg +11 -0
- package/icons/phosphor.json +53 -0
- package/icons/round.json +8 -0
- package/integrations/datastar.js +202 -0
- package/integrations/quickcrop.css +26 -0
- package/integrations/quickcrop.js +56 -0
- package/integrations/richclay.css +100 -0
- package/integrations/richclay.js +131 -0
- package/package.json +630 -0
- package/react/README.md +244 -0
- package/src/README.md +83 -0
- package/vendor/datastar/datastar-1.0.3.js +10 -0
- package/vendor/datastar/provenance.json +6 -0
- package/vendor/floating-ui/LICENSE-core +20 -0
- package/vendor/floating-ui/LICENSE-dom +20 -0
- package/vendor/floating-ui/floating-ui.core.umd.min.js +1 -0
- package/vendor/floating-ui/floating-ui.dom.umd.min.js +1 -0
- package/vendor/floating-ui/provenance.json +17 -0
- package/vendor/richclay/LICENSE +16 -0
- package/vendor/richclay/THIRD-PARTY-NOTICES.md +45 -0
- package/vendor/richclay/provenance.json +17 -0
- package/vendor/richclay/richclay.css +404 -0
- package/vendor/richclay/richclay.js +2940 -0
- package/vendor/richclay/vendor/DOMPURIFY-LICENSE +202 -0
- package/vendor/richclay/vendor/DOMPURIFY-LICENSE-MPL +373 -0
- package/vendor/richclay/vendor/SQUIRE-LICENSE +21 -0
- package/vendor/richclay/vendor/purify.min.js +3 -0
- package/vendor/richclay/vendor/squire.js +22 -0
- package/vendor/richclay/vendor/squire.provenance.json +30 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
(function () {
|
|
2
|
+
if (!window.Bevel || window.Bevel.crop) return;
|
|
3
|
+
const modalFor = (trigger, presets, onPreset) => ({
|
|
4
|
+
fit() {
|
|
5
|
+
return { width: Math.max(1, Math.min(760, window.innerWidth - 120)), height: Math.max(1, Math.min(560, window.innerHeight - 270)) };
|
|
6
|
+
},
|
|
7
|
+
open({ content, confirmLabel, onConfirm, onCancel }) {
|
|
8
|
+
const dialog = document.createElement("dialog");
|
|
9
|
+
dialog.className = "bevel-modal bevel-quickcrop";
|
|
10
|
+
dialog.setAttribute("aria-label", "Crop image");
|
|
11
|
+
dialog.setAttribute("data-bevel-transient", "");
|
|
12
|
+
dialog.innerHTML = '<button type="button" class="bevel-overlay__close" data-bevel-crop-cancel aria-label="Cancel crop"><svg aria-hidden="true" viewBox="0 0 256 256" fill="currentColor"><path d="M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z"/></svg></button><div class="bevel-modal__inner"><header class="bevel-modal__header"><h2 class="bevel-modal__heading">Crop image</h2><p class="bevel-modal__description"></p></header><div class="bevel-modal__body bevel-quickcrop__body"></div><footer class="bevel-modal__footer"><button type="button" class="bevel-button" data-bevel-crop-cancel>Cancel</button><button type="button" class="bevel-button bevel-button--primary" data-bevel-crop-confirm autofocus></button></footer></div>';
|
|
13
|
+
const image = content.querySelector("img");
|
|
14
|
+
const header = dialog.querySelector(".bevel-modal__header");
|
|
15
|
+
const presetRoot = document.createElement("div");
|
|
16
|
+
presetRoot.className = "bevel-quickcrop__presets";
|
|
17
|
+
for (const preset of presets || []) { const button = document.createElement("button"); button.type = "button"; button.className = "bevel-button bevel-button--small"; button.dataset.bevelCropPreset = preset.value; button.textContent = preset.label; presetRoot.append(button); }
|
|
18
|
+
if (presetRoot.childElementCount) { const help = document.createElement("p"); help.className = "bevel-quickcrop__help"; help.textContent = "Changing the aspect resets the crop selection."; header.append(presetRoot, help); }
|
|
19
|
+
dialog.querySelector(".bevel-modal__description").textContent = `Original image: ${image.naturalWidth} × ${image.naturalHeight} pixels.`;
|
|
20
|
+
dialog.querySelector(".bevel-quickcrop__body").append(content);
|
|
21
|
+
dialog.querySelector("[data-bevel-crop-confirm]").textContent = confirmLabel;
|
|
22
|
+
document.body.append(dialog);
|
|
23
|
+
let done = false;
|
|
24
|
+
const finish = callback => { if (done) return; done = true; callback(); };
|
|
25
|
+
const connectedTrigger = trigger?.isConnected;
|
|
26
|
+
const observer = new MutationObserver(() => {
|
|
27
|
+
if (!dialog.isConnected || (connectedTrigger && !trigger.isConnected)) finish(onCancel);
|
|
28
|
+
});
|
|
29
|
+
const accept = (callback, reason) => {
|
|
30
|
+
if (!done && window.Bevel.close(dialog, { reason })) finish(callback);
|
|
31
|
+
};
|
|
32
|
+
dialog.querySelector("[data-bevel-crop-confirm]").addEventListener("click", () => accept(onConfirm, "confirm"));
|
|
33
|
+
dialog.querySelectorAll("[data-bevel-crop-cancel]").forEach(button => button.addEventListener("click", () => accept(onCancel, "cancel")));
|
|
34
|
+
presetRoot.addEventListener("click", event => { const button = event.target.closest("[data-bevel-crop-preset]"); if (!button || done || !window.Bevel.close(dialog, { reason: "preset" })) return; onPreset?.(button.dataset.bevelCropPreset); finish(onCancel); });
|
|
35
|
+
dialog.addEventListener("close", () => finish(onCancel));
|
|
36
|
+
try {
|
|
37
|
+
if (!window.Bevel.open(dialog, { trigger })) throw new Error("Bevel crop dialog opening was canceled.");
|
|
38
|
+
} catch (error) {
|
|
39
|
+
done = true;
|
|
40
|
+
window.Bevel.destroy(dialog);
|
|
41
|
+
dialog.remove();
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
observer.observe(document.body, { childList: true, subtree: true });
|
|
45
|
+
return { close() { done = true; observer.disconnect(); window.Bevel.destroy(dialog); dialog.remove(); } };
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
window.Bevel.crop = function (file, { quickcrop = window.quickcrop, aspect = null, trigger, presets, onPreset } = {}) {
|
|
49
|
+
if (typeof quickcrop !== "function") {
|
|
50
|
+
const detail = { component: "dropzone", code: "missing-quickcrop", message: "Quickcrop is required to crop an image." };
|
|
51
|
+
(trigger || document).dispatchEvent(new CustomEvent("bevel:error", { bubbles: true, detail }));
|
|
52
|
+
return Promise.reject(new Error(detail.message));
|
|
53
|
+
}
|
|
54
|
+
return quickcrop(file, { aspect, modal: modalFor(trigger, presets, onPreset) });
|
|
55
|
+
};
|
|
56
|
+
})();
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
@layer components {
|
|
2
|
+
.bevel-richtext,
|
|
3
|
+
.bevel-inline-edit[data-bevel-edit-kind="rich"],
|
|
4
|
+
[data-bevel-richclay-chrome] {
|
|
5
|
+
--richclay-surface: var(--bevel-surface);
|
|
6
|
+
--richclay-surface-alt: var(--bevel-sunk);
|
|
7
|
+
--richclay-text: var(--bevel-ink);
|
|
8
|
+
--richclay-muted: var(--bevel-muted);
|
|
9
|
+
--richclay-border: var(--bevel-line-2);
|
|
10
|
+
--richclay-accent: var(--bevel-brass);
|
|
11
|
+
--richclay-accent-ink: var(--bevel-ground);
|
|
12
|
+
--richclay-focus: var(--bevel-brass);
|
|
13
|
+
--richclay-danger: var(--bevel-ox);
|
|
14
|
+
--richclay-radius: 0px;
|
|
15
|
+
--richclay-control-size: 32px;
|
|
16
|
+
--richclay-shadow: var(--bevel-shadow);
|
|
17
|
+
font-family: var(--bevel-font-sans);
|
|
18
|
+
}
|
|
19
|
+
.bevel-inline-edit--title .bevel-inline-edit__input {
|
|
20
|
+
--richclay-muted: var(--bevel-faint);
|
|
21
|
+
--richclay-focus: transparent;
|
|
22
|
+
--richclay-border: transparent;
|
|
23
|
+
}
|
|
24
|
+
.bevel-richtext :where(.richclay-toolbar),
|
|
25
|
+
:where(.richclay-float, .richclay-dialog)[data-bevel-richclay-chrome] { color: var(--bevel-ink); background: var(--bevel-surface); border: 1px solid var(--bevel-line-2); }
|
|
26
|
+
.bevel-richtext :where([contenteditable="true"]):focus { outline: 2px solid var(--bevel-brass); outline-offset: 2px; }
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.bevel-richtext { border: 0; }
|
|
30
|
+
:is(.bevel-richtext, [data-bevel-richclay-chrome]) .richclay-toolbar,
|
|
31
|
+
.richclay-toolbar[data-bevel-richclay-chrome] {
|
|
32
|
+
gap: 3px;
|
|
33
|
+
margin: 0;
|
|
34
|
+
padding: 8px;
|
|
35
|
+
border: 1px solid var(--bevel-line-2);
|
|
36
|
+
border-radius: 0;
|
|
37
|
+
background: var(--bevel-sunk);
|
|
38
|
+
color: var(--bevel-ink);
|
|
39
|
+
}
|
|
40
|
+
:is(.bevel-richtext, [data-bevel-richclay-chrome]) .richclay-button {
|
|
41
|
+
min-width: 32px;
|
|
42
|
+
height: 32px;
|
|
43
|
+
padding: 0 7px;
|
|
44
|
+
gap: 6px;
|
|
45
|
+
border: 2px solid;
|
|
46
|
+
border-color: var(--bevel-edge-hi) var(--bevel-edge-lo) var(--bevel-edge-lo) var(--bevel-edge-hi);
|
|
47
|
+
border-radius: 0;
|
|
48
|
+
background: var(--bevel-face);
|
|
49
|
+
font: 14px var(--bevel-font-sans);
|
|
50
|
+
cursor: pointer;
|
|
51
|
+
}
|
|
52
|
+
:is(.bevel-richtext, [data-bevel-richclay-chrome]) .richclay-button:is([aria-pressed="true"], [aria-expanded="true"]) {
|
|
53
|
+
background: var(--bevel-face-in);
|
|
54
|
+
border-color: var(--bevel-edge-in) var(--bevel-edge-in-hi) var(--bevel-edge-in-hi) var(--bevel-edge-in);
|
|
55
|
+
box-shadow: none;
|
|
56
|
+
color: var(--bevel-ink);
|
|
57
|
+
}
|
|
58
|
+
:is(.bevel-richtext, [data-bevel-richclay-chrome]) .richclay-button[aria-pressed="true"] > svg { translate: 1px 1px; }
|
|
59
|
+
:is(.bevel-richtext, [data-bevel-richclay-chrome]) .richclay-button:disabled { opacity: .45; cursor: not-allowed; }
|
|
60
|
+
:is(.bevel-richtext, [data-bevel-richclay-chrome]) .richclay-button:hover:not([aria-pressed="true"], [aria-expanded="true"], :disabled) {
|
|
61
|
+
border-color: var(--bevel-edge-hi) var(--bevel-edge-lo) var(--bevel-edge-lo) var(--bevel-edge-hi);
|
|
62
|
+
background: color-mix(in srgb, var(--bevel-face), var(--bevel-edge-hi) 45%);
|
|
63
|
+
}
|
|
64
|
+
:is(.bevel-richtext, [data-bevel-richclay-chrome]) .richclay-separator { align-self: center; height: 22px; margin: 0 5px; background: var(--bevel-line-2); }
|
|
65
|
+
:is(.bevel-richtext, [data-bevel-richclay-chrome]) .richclay-menu { inset-block-start: 38px; min-width: 210px; padding: 5px; border-radius: 0; box-shadow: var(--bevel-shadow); }
|
|
66
|
+
:is(.bevel-richtext, [data-bevel-richclay-chrome]) .richclay-menu-item { padding: 8px 10px; border: 0; border-radius: 0; font: 14px var(--bevel-font-sans); }
|
|
67
|
+
:is(.bevel-richtext, [data-bevel-richclay-chrome]) .richclay-menu-item[aria-checked="true"] { background: var(--bevel-sunk); box-shadow: inset 2px 0 var(--bevel-brass); }
|
|
68
|
+
:is(.bevel-richtext, [data-bevel-richclay-chrome]) [data-richclay-menu-item="blockMenu"][data-richclay-option-index="1"] { font: 500 18px var(--bevel-font-serif); }
|
|
69
|
+
:is(.bevel-richtext, [data-bevel-richclay-chrome]) [data-richclay-menu-item="blockMenu"][data-richclay-option-index="2"] { font: 500 15.5px var(--bevel-font-serif); }
|
|
70
|
+
.bevel-richtext > [data-bevel-richtext] { position: relative; margin: 0; min-height: 240px; padding: 28px 30px; border: 1px solid var(--bevel-line-2); border-radius: 0; background: var(--bevel-surface); color: var(--bevel-ink); overflow-wrap: anywhere; }
|
|
71
|
+
.bevel-richtext > .richclay-toolbar + [data-bevel-richtext] { border-top: 0; }
|
|
72
|
+
.bevel-richtext > [data-bevel-richtext] h2 { margin: 0; font: 400 29px/1.15 var(--bevel-font-serif); }
|
|
73
|
+
.bevel-richtext > [data-bevel-richtext] p { margin: 14px 0; font-size: 14.5px; line-height: 1.7; color: var(--bevel-ink-2); }
|
|
74
|
+
.bevel-richtext > [data-bevel-richtext] :is(strong, b) { color: var(--bevel-ink); }
|
|
75
|
+
.bevel-richtext > [data-bevel-richtext] blockquote { margin: 20px 0; padding-left: 18px; border-left: 2px solid var(--bevel-brass); font: 21px var(--bevel-font-serif); color: var(--bevel-ink); }
|
|
76
|
+
.bevel-richtext > [data-bevel-richtext] a { color: var(--bevel-brass); }
|
|
77
|
+
.richclay-dialog[data-bevel-richclay-chrome] { position: relative; width: min(100%, 360px); margin: 16px 0; padding: 14px 16px 12px; border: 1px solid var(--bevel-line-2); border-radius: 0; background: var(--bevel-surface); color: var(--bevel-ink); box-shadow: var(--bevel-shadow); }
|
|
78
|
+
.richclay-dialog[data-bevel-richclay-chrome]::before { content: ""; position: absolute; left: calc(var(--richclay-dialog-arrow, 28px) - 6px); top: -7px; width: 12px; height: 12px; background: var(--bevel-surface); border-top: 1px solid var(--bevel-line-2); border-left: 1px solid var(--bevel-line-2); transform: rotate(45deg); }
|
|
79
|
+
.richclay-dialog[data-bevel-richclay-chrome][data-richclay-side="above"]::before { top: auto; bottom: -7px; border: 0; border-right: 1px solid var(--bevel-line-2); border-bottom: 1px solid var(--bevel-line-2); }
|
|
80
|
+
[data-bevel-richclay-chrome] .richclay-dialog-title { margin-bottom: 2px; font: 500 10px var(--bevel-font-mono); text-transform: uppercase; letter-spacing: .12em; }
|
|
81
|
+
[data-bevel-richclay-chrome] .richclay-field { gap: 5px; }
|
|
82
|
+
[data-bevel-richclay-chrome] .richclay-field > span { color: var(--bevel-ink-2); font-size: 12px; }
|
|
83
|
+
[data-bevel-richclay-chrome] .richclay-input { min-height: 30px; padding: 4px 8px; border: 2px solid; border-color: var(--bevel-edge-in) var(--bevel-edge-in-hi) var(--bevel-edge-in-hi) var(--bevel-edge-in); border-radius: 0; background: var(--bevel-sunk); color: var(--bevel-ink); font: 13px var(--bevel-font-sans); }
|
|
84
|
+
[data-bevel-richclay-chrome] .richclay-dialog-actions { margin-top: 4px; padding-top: 12px; border-top: 1px solid var(--bevel-line); flex-wrap: wrap; }
|
|
85
|
+
[data-bevel-richclay-chrome] :is(.richclay-primary, .richclay-secondary) { min-height: 30px; padding: 4px 10px; border: 2px solid; border-color: var(--bevel-edge-hi) var(--bevel-edge-lo) var(--bevel-edge-lo) var(--bevel-edge-hi); border-radius: 0; background: var(--bevel-face); color: var(--bevel-ink); font: 13px var(--bevel-font-sans); }
|
|
86
|
+
[data-bevel-richclay-chrome] .richclay-primary { background: var(--bevel-ink); color: var(--bevel-ground); border-color: color-mix(in srgb, var(--bevel-ink), white 24%) color-mix(in srgb, var(--bevel-ink), black 32%) color-mix(in srgb, var(--bevel-ink), black 32%) color-mix(in srgb, var(--bevel-ink), white 24%); }
|
|
87
|
+
.richclay-float[data-bevel-richclay-chrome] { border-radius: 0; box-shadow: var(--bevel-shadow); }
|
|
88
|
+
.richclay-float[data-bevel-richclay-chrome] > .richclay-toolbar { padding: 5px; }
|
|
89
|
+
@media (max-width: 540px) {
|
|
90
|
+
.bevel-richtext > [data-bevel-richtext] { padding: 20px 18px; }
|
|
91
|
+
.bevel-richtext > [data-bevel-richtext] blockquote { font-size: 18px; }
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
[data-bevel-richclay-icon] { display: inline-flex; align-items: center; justify-content: center; gap: 6px; }
|
|
95
|
+
[data-bevel-richclay-chrome] [data-richclay-control="blockMenu"] { min-width: 60px; padding: 0 7px; font-size: 13.5px; }
|
|
96
|
+
[data-bevel-richclay-chrome] [data-richclay-control="blockMenu"] [data-bevel-richclay-icon] { width: 100%; justify-content: space-between; }
|
|
97
|
+
[data-bevel-richclay-chrome] [aria-pressed="true"] > [data-bevel-richclay-icon] { translate: 1px 1px; }
|
|
98
|
+
@media (max-width: 540px) {
|
|
99
|
+
[data-bevel-richclay-chrome] [data-richclay-control="blockMenu"] { min-width: 0; }
|
|
100
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
(function () {
|
|
2
|
+
if (!window.Bevel || window.Bevel.richtext) return;
|
|
3
|
+
const mounted = new Map();
|
|
4
|
+
let observer;
|
|
5
|
+
const editors = (root) => [...(root.matches?.("[data-bevel-richtext]") ? [root] : []), ...root.querySelectorAll("[data-bevel-richtext]")];
|
|
6
|
+
const icons = Object.freeze({
|
|
7
|
+
blockMenu: "<svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"square\" stroke-linejoin=\"miter\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M19 4h-9a4.5 4.5 0 0 0 0 9h3M13 4v16M17 4v16\"/></svg>",
|
|
8
|
+
bold: "<svg width=\"15\" height=\"15\" viewBox=\"0 0 256 256\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M178.48,115.7A44,44,0,0,0,148,40H80a8,8,0,0,0-8,8V200a8,8,0,0,0,8,8h80a48,48,0,0,0,18.48-92.3ZM88,56h60a28,28,0,0,1,0,56H88Zm72,136H88V128h72a32,32,0,0,1,0,64Z\"/></svg>",
|
|
9
|
+
italic: "<svg width=\"15\" height=\"15\" viewBox=\"0 0 256 256\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M200,56a8,8,0,0,1-8,8H157.77L115.1,192H144a8,8,0,0,1,0,16H64a8,8,0,0,1,0-16H98.23L140.9,64H112a8,8,0,0,1,0-16h80A8,8,0,0,1,200,56Z\"/></svg>",
|
|
10
|
+
underline: "<svg width=\"15\" height=\"15\" viewBox=\"0 0 256 256\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M200,224a8,8,0,0,1-8,8H64a8,8,0,0,1,0-16H192A8,8,0,0,1,200,224Zm-72-24a64.07,64.07,0,0,0,64-64V56a8,8,0,0,0-16,0v80a48,48,0,0,1-96,0V56a8,8,0,0,0-16,0v80A64.07,64.07,0,0,0,128,200Z\"/></svg>",
|
|
11
|
+
strikethrough: "<svg width=\"15\" height=\"15\" viewBox=\"0 0 256 256\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M224,128a8,8,0,0,1-8,8H175.93c9.19,7.11,16.07,17.2,16.07,32,0,13.34-7,25.7-19.75,34.79C160.33,211.31,144.61,216,128,216s-32.33-4.69-44.25-13.21C71,193.7,64,181.34,64,168a8,8,0,0,1,16,0c0,17.35,22,32,48,32s48-14.65,48-32c0-14.85-10.54-23.58-38.77-32H40a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM76.33,104a8,8,0,0,0,7.61-10.49A17.3,17.3,0,0,1,83.11,88c0-18.24,19.3-32,44.89-32,18.84,0,34.16,7.42,41,19.85a8,8,0,0,0,14-7.7C173.33,50.52,152.77,40,128,40,93.29,40,67.11,60.63,67.11,88a33.73,33.73,0,0,0,1.62,10.49A8,8,0,0,0,76.33,104Z\"/></svg>",
|
|
12
|
+
code: "<svg width=\"15\" height=\"15\" viewBox=\"0 0 256 256\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M69.12,94.15,28.5,128l40.62,33.85a8,8,0,1,1-10.24,12.29l-48-40a8,8,0,0,1,0-12.29l48-40a8,8,0,0,1,10.24,12.3Zm176,27.7-48-40a8,8,0,1,0-10.24,12.3L227.5,128l-40.62,33.85a8,8,0,1,0,10.24,12.29l48-40a8,8,0,0,0,0-12.29ZM162.73,32.48a8,8,0,0,0-10.25,4.79l-64,176a8,8,0,0,0,4.79,10.26A8.14,8.14,0,0,0,96,224a8,8,0,0,0,7.52-5.27l64-176A8,8,0,0,0,162.73,32.48Z\"/></svg>",
|
|
13
|
+
link: "<svg width=\"15\" height=\"15\" viewBox=\"0 0 256 256\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M240,88.23a54.43,54.43,0,0,1-16,37L189.25,160a54.27,54.27,0,0,1-38.63,16h-.05A54.63,54.63,0,0,1,96,119.84a8,8,0,0,1,16,.45A38.62,38.62,0,0,0,150.58,160h0a38.39,38.39,0,0,0,27.31-11.31l34.75-34.75a38.63,38.63,0,0,0-54.63-54.63l-11,11A8,8,0,0,1,135.7,59l11-11A54.65,54.65,0,0,1,224,48,54.86,54.86,0,0,1,240,88.23ZM109,185.66l-11,11A38.41,38.41,0,0,1,70.6,208h0a38.63,38.63,0,0,1-27.29-65.94L78,107.31A38.63,38.63,0,0,1,144,135.71a8,8,0,0,0,16,.45A54.86,54.86,0,0,0,144,96a54.65,54.65,0,0,0-77.27,0L32,130.75A54.62,54.62,0,0,0,70.56,224h0a54.28,54.28,0,0,0,38.64-16l11-11A8,8,0,0,0,109,185.66Z\"/></svg>",
|
|
14
|
+
unorderedList: "<svg width=\"15\" height=\"15\" viewBox=\"0 0 256 256\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M80,64a8,8,0,0,1,8-8H216a8,8,0,0,1,0,16H88A8,8,0,0,1,80,64Zm136,56H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16Zm0,64H88a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16ZM44,52A12,12,0,1,0,56,64,12,12,0,0,0,44,52Zm0,64a12,12,0,1,0,12,12A12,12,0,0,0,44,116Zm0,64a12,12,0,1,0,12,12A12,12,0,0,0,44,180Z\"/></svg>",
|
|
15
|
+
orderedList: "<svg width=\"15\" height=\"15\" viewBox=\"0 0 256 256\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M224,128a8,8,0,0,1-8,8H104a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM104,72H216a8,8,0,0,0,0-16H104a8,8,0,0,0,0,16ZM216,184H104a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16ZM43.58,55.16,48,52.94V104a8,8,0,0,0,16,0V40a8,8,0,0,0-11.58-7.16l-16,8a8,8,0,0,0,7.16,14.32ZM79.77,156.72a23.73,23.73,0,0,0-9.6-15.95,24.86,24.86,0,0,0-34.11,4.7,23.63,23.63,0,0,0-3.57,6.46,8,8,0,1,0,15,5.47,7.84,7.84,0,0,1,1.18-2.13,8.76,8.76,0,0,1,12-1.59A7.91,7.91,0,0,1,63.93,159a7.64,7.64,0,0,1-1.57,5.78,1,1,0,0,0-.08.11L33.59,203.21A8,8,0,0,0,40,216H72a8,8,0,0,0,0-16H56l19.08-25.53A23.47,23.47,0,0,0,79.77,156.72Z\"/></svg>",
|
|
16
|
+
quote: "<svg width=\"15\" height=\"15\" viewBox=\"0 0 256 256\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M100,56H40A16,16,0,0,0,24,72v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,100,56Zm0,80H40V72h60ZM216,56H156a16,16,0,0,0-16,16v64a16,16,0,0,0,16,16h60v8a32,32,0,0,1-32,32,8,8,0,0,0,0,16,48.05,48.05,0,0,0,48-48V72A16,16,0,0,0,216,56Zm0,80H156V72h60Z\"/></svg>",
|
|
17
|
+
outdent: "<svg width=\"15\" height=\"15\" viewBox=\"0 0 256 256\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M224,128a8,8,0,0,1-8,8H112a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM112,72H216a8,8,0,0,0,0-16H112a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16ZM72,144a8,8,0,0,0,5.66-13.66L43.31,96,77.66,61.66A8,8,0,0,0,66.34,50.34l-40,40a8,8,0,0,0,0,11.32l40,40A8,8,0,0,0,72,144Z\"/></svg>",
|
|
18
|
+
indent: "<svg width=\"15\" height=\"15\" viewBox=\"0 0 256 256\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M224,128a8,8,0,0,1-8,8H112a8,8,0,0,1,0-16H216A8,8,0,0,1,224,128ZM112,72H216a8,8,0,0,0,0-16H112a8,8,0,0,0,0,16ZM216,184H40a8,8,0,0,0,0,16H216a8,8,0,0,0,0-16ZM34.34,141.66a8,8,0,0,0,11.32,0l40-40a8,8,0,0,0,0-11.32l-40-40A8,8,0,0,0,34.34,61.66L68.69,96,34.34,130.34A8,8,0,0,0,34.34,141.66Z\"/></svg>",
|
|
19
|
+
undo: "<svg width=\"15\" height=\"15\" viewBox=\"0 0 256 256\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M224,128a96,96,0,0,1-94.71,96H128A95.38,95.38,0,0,1,62.1,197.8a8,8,0,0,1,11-11.63A80,80,0,1,0,71.43,71.39a3.07,3.07,0,0,1-.26.25L44.59,96H72a8,8,0,0,1,0,16H24a8,8,0,0,1-8-8V56a8,8,0,0,1,16,0V85.8L60.25,60A96,96,0,0,1,224,128Z\"/></svg>",
|
|
20
|
+
redo: "<svg width=\"15\" height=\"15\" viewBox=\"0 0 256 256\" fill=\"currentColor\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M240,56v48a8,8,0,0,1-8,8H184a8,8,0,0,1,0-16H211.4L184.81,71.64l-.25-.24a80,80,0,1,0-1.67,114.78,8,8,0,0,1,11,11.63A95.44,95.44,0,0,1,128,224h-1.32A96,96,0,1,1,195.75,60L224,85.8V56a8,8,0,1,1,16,0Z\"/></svg>",
|
|
21
|
+
clearFormatting: "<svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"square\" stroke-linejoin=\"miter\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M3 3l18 18M5 5v3M9 5h10v3M12 5v3M12 12v7M8 19h8\"/></svg>",
|
|
22
|
+
paragraph: "<svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"square\" stroke-linejoin=\"miter\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M19 4h-9a4.5 4.5 0 0 0 0 9h3M13 4v16M17 4v16\"/></svg>",
|
|
23
|
+
h1: "<svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M3.5 5.5v12M12 5.5v12M3.5 11.5H12M17 12l3-2v10\"/></svg>",
|
|
24
|
+
h2: "<svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M3.5 5.5v12M12 5.5v12M3.5 11.5H12M16 12.5c0-3.5 6-3.5 6 0 0 2-2.5 3.5-6 7.5h6\"/></svg>",
|
|
25
|
+
h3: "<svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M3.5 5.5v12M12 5.5v12M3.5 11.5H12M16 11c1.5-1.5 6-1.5 6 1.5 0 1.5-1.5 2.5-3 2.5h-1M19 15c1.5 0 3 1 3 2.5 0 3-4.5 3-6 1.5\"/></svg>",
|
|
26
|
+
});
|
|
27
|
+
const menuCaret = "<svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.6\" stroke-linecap=\"square\" stroke-linejoin=\"miter\" aria-hidden=\"true\" focusable=\"false\"><path d=\"m5 9 7 7 7-7\"/></svg>";
|
|
28
|
+
const themeControls = record => {
|
|
29
|
+
if (!record.owned || !record.editor.squire) return;
|
|
30
|
+
const toolbar = record.editor.toolbar || record.editor.float?.toolbar;
|
|
31
|
+
for (const item of toolbar?.items || []) {
|
|
32
|
+
const id = item.def.id;
|
|
33
|
+
if (id === "undo" || id === "redo") item.button.disabled = !record.history?.[id];
|
|
34
|
+
if (!(id in icons)) continue;
|
|
35
|
+
let face = item.button.querySelector("[data-bevel-richclay-icon]");
|
|
36
|
+
if (!face) {
|
|
37
|
+
for (const child of [...item.button.children]) if (!child.classList.contains("richclay-sr-only")) child.remove();
|
|
38
|
+
face = document.createElement("span"); face.dataset.bevelRichclayIcon = ""; face.setAttribute("aria-hidden", "true");
|
|
39
|
+
face.innerHTML = id === "blockMenu" ? icons.blockMenu + menuCaret : icons[id];
|
|
40
|
+
item.button.prepend(face);
|
|
41
|
+
}
|
|
42
|
+
if (id === "blockMenu") {
|
|
43
|
+
const option = item.def.options.find(option => option.isActive?.(record.editor));
|
|
44
|
+
const markup = (option?.icon || icons.blockMenu) + menuCaret;
|
|
45
|
+
if (face.dataset.blockValue !== (option?.value || "P")) {
|
|
46
|
+
face.innerHTML = markup;
|
|
47
|
+
face.dataset.blockValue = option?.value || "P";
|
|
48
|
+
}
|
|
49
|
+
const optionIcons = [icons.paragraph, icons.h1, icons.h2, icons.h3, icons.quote, icons.code];
|
|
50
|
+
for (const [index, markup] of optionIcons.entries()) {
|
|
51
|
+
const button = item.menu?.querySelector(`[data-richclay-option-index="${index}"]`);
|
|
52
|
+
if (!button || button.hasAttribute("data-bevel-richclay-icon")) continue;
|
|
53
|
+
const current = button?.querySelector("svg");
|
|
54
|
+
if (current) current.insertAdjacentHTML("beforebegin", markup), current.remove();
|
|
55
|
+
else button.insertAdjacentHTML("afterbegin", markup);
|
|
56
|
+
button.dataset.bevelRichclayIcon = "";
|
|
57
|
+
}
|
|
58
|
+
const label = option?.label || "Paragraph";
|
|
59
|
+
const accessibleLabel = `Text style: ${label}`;
|
|
60
|
+
item.button.setAttribute("aria-label", accessibleLabel);
|
|
61
|
+
item.button.title = accessibleLabel;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
const themeChrome = () => {
|
|
66
|
+
for (const [element, record] of mounted) {
|
|
67
|
+
if (record.owned && record.editor.squire && !record.onSelection) {
|
|
68
|
+
record.history = { undo: false, redo: false };
|
|
69
|
+
record.onHistory = event => { record.history = { undo: Boolean(event.detail.canUndo), redo: Boolean(event.detail.canRedo) }; themeControls(record); (record.editor.toolbar || record.editor.float?.toolbar)?.ensureSingleTabStop(); };
|
|
70
|
+
record.editor.squire.addEventListener("undoStateChange", record.onHistory);
|
|
71
|
+
record.onSelection = () => themeControls(record);
|
|
72
|
+
for (const type of ["pathChange", "select", "cursor"]) record.editor.squire.addEventListener(type, record.onSelection);
|
|
73
|
+
}
|
|
74
|
+
themeControls(record);
|
|
75
|
+
const current = new Set([record.editor.toolbar?.root, record.editor.float?.root, record.editor.dialog, record.editor.liveRegion, record.editor.description].filter(Boolean));
|
|
76
|
+
for (const node of record.chrome) if (!current.has(node)) {
|
|
77
|
+
node.removeAttribute("data-bevel-richclay-chrome");
|
|
78
|
+
record.chrome.delete(node);
|
|
79
|
+
}
|
|
80
|
+
if (record.owned && element.closest('[data-bevel-transient="inline-draft"]')) for (const node of current) {
|
|
81
|
+
if (!node.hasAttribute("data-bevel-transient")) {
|
|
82
|
+
node.setAttribute("data-bevel-transient", "inline-editor-chrome");
|
|
83
|
+
record.transients.add(node);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
for (const node of current) if (!node.hasAttribute("data-bevel-richclay-chrome")) {
|
|
87
|
+
node.setAttribute("data-bevel-richclay-chrome", "");
|
|
88
|
+
record.chrome.add(node);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
window.Bevel.richtext = {
|
|
93
|
+
mount(root, { RichClay = window.RichClay, ...options } = {}) {
|
|
94
|
+
if (typeof RichClay !== "function") {
|
|
95
|
+
root.dispatchEvent(new CustomEvent("bevel:error", { bubbles: true, detail: { component: "richtext", code: "missing-richclay", message: "Richclay is required to mount a rich text editor." } }));
|
|
96
|
+
throw new Error("Richclay is required to mount a rich text editor.");
|
|
97
|
+
}
|
|
98
|
+
const instances = editors(root).map((element) => {
|
|
99
|
+
if (mounted.has(element)) return mounted.get(element).editor;
|
|
100
|
+
function onChange(...args) { return options.onChange?.apply(this, args); }
|
|
101
|
+
const editor = new RichClay(element, { ...options, onChange });
|
|
102
|
+
// Richclay returns an existing instance without applying new options.
|
|
103
|
+
mounted.set(element, { editor, RichClay, owned: editor.options.onChange === onChange, chrome: new Set(), transients: new Set() });
|
|
104
|
+
return editor;
|
|
105
|
+
});
|
|
106
|
+
themeChrome();
|
|
107
|
+
if (mounted.size && !observer) {
|
|
108
|
+
observer = new MutationObserver(themeChrome);
|
|
109
|
+
observer.observe(document.body, { childList: true, subtree: true });
|
|
110
|
+
}
|
|
111
|
+
return instances;
|
|
112
|
+
},
|
|
113
|
+
prepareForSave(cloneRoot) {
|
|
114
|
+
for (const RichClay of new Set([...mounted.values()].map(record => record.RichClay))) RichClay.stripFromClone(cloneRoot);
|
|
115
|
+
return cloneRoot;
|
|
116
|
+
},
|
|
117
|
+
unmount(root, { preserve = [] } = {}) {
|
|
118
|
+
for (const [element, record] of mounted) {
|
|
119
|
+
if (element !== root && !root.contains(element)) continue;
|
|
120
|
+
if (preserve.some(scope => scope === element || scope.contains?.(element))) continue;
|
|
121
|
+
mounted.delete(element);
|
|
122
|
+
if (record.onHistory && record.editor.squire) record.editor.squire.removeEventListener("undoStateChange", record.onHistory);
|
|
123
|
+
if (record.onSelection && record.editor.squire) for (const type of ["pathChange", "select", "cursor"]) record.editor.squire.removeEventListener(type, record.onSelection);
|
|
124
|
+
for (const node of record.chrome) node.removeAttribute("data-bevel-richclay-chrome");
|
|
125
|
+
for (const node of record.transients) node.removeAttribute("data-bevel-transient");
|
|
126
|
+
if (record.owned) record.editor.destroy();
|
|
127
|
+
}
|
|
128
|
+
if (!mounted.size) { observer?.disconnect(); observer = null; }
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
})();
|