@livenetworks/ashlar 1.6.1 → 2.0.1
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 +641 -0
- package/README.md +190 -86
- package/{js → components}/COMPONENTS.md +1116 -1108
- package/{js → components}/index.js +81 -58
- package/{js → components}/ln-accordion/README.md +7 -6
- package/components/ln-accordion/ln-accordion-dev.scss +8 -0
- package/components/ln-accordion/ln-accordion.js +1 -0
- package/components/ln-accordion/ln-accordion.schema.json +30 -0
- package/components/ln-accordion/ln-accordion.scss +8 -0
- package/{js → components}/ln-accordion/src/ln-accordion.js +8 -2
- package/{js → components}/ln-ajax/README.md +171 -160
- package/components/ln-ajax/ln-ajax-dev.scss +8 -0
- package/components/ln-ajax/ln-ajax.js +1 -0
- package/components/ln-ajax/ln-ajax.schema.json +30 -0
- package/{js → components}/ln-ajax/src/ln-ajax.js +65 -30
- package/{js → components}/ln-api-connector/README.md +27 -5
- package/components/ln-api-connector/ln-api-connector.js +1 -0
- package/components/ln-api-connector/ln-api-connector.schema.json +96 -0
- package/components/ln-api-connector/src/connector-core.js +97 -0
- package/components/ln-api-connector/src/ln-api-connector.js +447 -0
- package/{js → components}/ln-api-queue/README.md +12 -9
- package/components/ln-api-queue/ln-api-queue.js +1 -0
- package/components/ln-api-queue/ln-api-queue.schema.json +34 -0
- package/{js → components}/ln-api-queue/src/ln-api-queue.js +33 -14
- package/{js → components}/ln-api-queue/src/queue-storage.js +7 -3
- package/{js → components}/ln-autoresize/README.md +129 -127
- package/components/ln-autoresize/ln-autoresize-dev.scss +8 -0
- package/components/ln-autoresize/ln-autoresize.js +1 -0
- package/components/ln-autoresize/ln-autoresize.schema.json +22 -0
- package/{js → components}/ln-autoresize/src/ln-autoresize.js +8 -1
- package/{js → components}/ln-autosave/README.md +127 -124
- package/components/ln-autosave/ln-autosave-dev.scss +13 -0
- package/components/ln-autosave/ln-autosave.js +1 -0
- package/components/ln-autosave/ln-autosave.schema.json +48 -0
- package/components/ln-autosave/src/autosave-model.js +34 -0
- package/{js → components}/ln-autosave/src/ln-autosave.js +65 -58
- package/components/ln-chart/README.md +145 -0
- package/components/ln-chart/ln-chart-dev.scss +20 -0
- package/components/ln-chart/ln-chart.js +1 -0
- package/components/ln-chart/ln-chart.schema.json +146 -0
- package/components/ln-chart/ln-chart.scss +8 -0
- package/components/ln-chart/src/chart-model.js +154 -0
- package/components/ln-chart/src/ln-chart.js +176 -0
- package/{js → components}/ln-circular-progress/README.md +15 -14
- package/components/ln-circular-progress/ln-circular-progress-dev.scss +8 -0
- package/components/ln-circular-progress/ln-circular-progress.js +1 -0
- package/components/ln-circular-progress/ln-circular-progress.schema.json +42 -0
- package/{js → components}/ln-circular-progress/src/ln-circular-progress.js +32 -50
- package/{js → components}/ln-confirm/README.md +69 -18
- package/components/ln-confirm/ln-confirm-dev.scss +24 -0
- package/components/ln-confirm/ln-confirm.js +1 -0
- package/components/ln-confirm/ln-confirm.schema.json +66 -0
- package/components/ln-confirm/ln-confirm.scss +24 -0
- package/{js → components}/ln-confirm/src/ln-confirm.js +180 -171
- package/{js → components}/ln-core/README.md +374 -149
- package/components/ln-core/attrs.js +273 -0
- package/components/ln-core/compare.js +40 -0
- package/components/ln-core/crypto.js +265 -0
- package/components/ln-core/date.js +50 -0
- package/components/ln-core/dom.js +115 -0
- package/components/ln-core/events.js +122 -0
- package/components/ln-core/form.js +136 -0
- package/{js → components}/ln-core/hash.js +149 -92
- package/components/ln-core/helpers.js +33 -0
- package/components/ln-core/http.js +48 -0
- package/components/ln-core/index.js +11 -0
- package/components/ln-core/lifecycle.js +403 -0
- package/components/ln-core/ln-core.schema.json +109 -0
- package/components/ln-core/locale.js +55 -0
- package/components/ln-core/matching.js +78 -0
- package/components/ln-core/number.js +125 -0
- package/components/ln-core/progress.js +30 -0
- package/components/ln-core/template.js +206 -0
- package/{js → components}/ln-core/window-cache.js +247 -213
- package/{js → components}/ln-couchdb-connector/README.md +7 -5
- package/components/ln-couchdb-connector/ln-couchdb-connector.js +1 -0
- package/components/ln-couchdb-connector/ln-couchdb-connector.schema.json +50 -0
- package/{js → components}/ln-couchdb-connector/src/ln-couchdb-connector.js +29 -43
- package/{js → components}/ln-data-coordinator/README.md +109 -73
- package/components/ln-data-coordinator/ln-data-coordinator-dev.scss +8 -0
- package/components/ln-data-coordinator/ln-data-coordinator.js +1 -0
- package/components/ln-data-coordinator/ln-data-coordinator.schema.json +196 -0
- package/components/ln-data-coordinator/src/data-read-policy.js +41 -0
- package/{js → components}/ln-data-coordinator/src/ln-data-coordinator.js +411 -154
- package/{js → components}/ln-data-coordinator/src/mutation-receipts.js +0 -5
- package/{js → components}/ln-data-store/README.md +42 -17
- package/components/ln-data-store/ln-data-store-dev.scss +13 -0
- package/components/ln-data-store/ln-data-store.js +1 -0
- package/components/ln-data-store/ln-data-store.schema.json +84 -0
- package/components/ln-data-store/src/data-store-model.js +155 -0
- package/{js → components}/ln-data-store/src/ln-data-store.js +407 -105
- package/components/ln-data-store/src/window-index.js +119 -0
- package/{js → components}/ln-date/README.md +17 -7
- package/{js → components}/ln-date/ln-date-dev.scss +14 -14
- package/components/ln-date/ln-date.js +1 -0
- package/components/ln-date/ln-date.schema.json +92 -0
- package/components/ln-date/src/date-model.js +186 -0
- package/components/ln-date/src/ln-date.js +486 -0
- package/components/ln-debug/README.md +132 -0
- package/components/ln-debug/ln-debug.js +1 -0
- package/components/ln-debug/ln-debug.schema.json +28 -0
- package/components/ln-debug/src/console-sink.js +19 -0
- package/components/ln-debug/src/debug-verifier.js +331 -0
- package/components/ln-debug/src/gate.js +95 -0
- package/components/ln-debug/src/generated-attributes.js +299 -0
- package/components/ln-debug/src/ln-debug.js +60 -0
- package/{js → components}/ln-dropdown/README.md +150 -140
- package/components/ln-dropdown/ln-dropdown-dev.scss +13 -0
- package/components/ln-dropdown/ln-dropdown.js +1 -0
- package/components/ln-dropdown/ln-dropdown.schema.json +90 -0
- package/components/ln-dropdown/ln-dropdown.scss +18 -0
- package/{js → components}/ln-dropdown/src/ln-dropdown.js +114 -11
- package/{js → components}/ln-editor/README.md +11 -9
- package/components/ln-editor/ln-editor-dev.scss +18 -0
- package/components/ln-editor/ln-editor.js +1 -0
- package/components/ln-editor/ln-editor.schema.json +58 -0
- package/components/ln-editor/ln-editor.scss +13 -0
- package/{js → components}/ln-editor/src/ln-editor.js +59 -11
- package/{js → components}/ln-external-links/README.md +10 -8
- package/components/ln-external-links/ln-external-links.js +1 -0
- package/components/ln-external-links/ln-external-links.schema.json +18 -0
- package/{js → components}/ln-external-links/src/ln-external-links.js +13 -11
- package/{js → components}/ln-fill/README.md +6 -8
- package/components/ln-fill/ln-fill.js +1 -0
- package/components/ln-fill/ln-fill.schema.json +23 -0
- package/{js → components}/ln-fill/src/ln-fill.js +7 -1
- package/components/ln-filter/README.md +131 -0
- package/components/ln-filter/ln-filter-dev.scss +13 -0
- package/components/ln-filter/ln-filter.js +1 -0
- package/components/ln-filter/ln-filter.schema.json +153 -0
- package/components/ln-filter/src/filter-model.js +185 -0
- package/components/ln-filter/src/ln-filter.js +435 -0
- package/{js → components}/ln-form/README.md +260 -264
- package/components/ln-form/ln-form-dev.scss +8 -0
- package/components/ln-form/ln-form.js +1 -0
- package/components/ln-form/ln-form.schema.json +45 -0
- package/{js → components}/ln-form/src/ln-form.js +107 -99
- package/{js → components}/ln-http/README.md +11 -6
- package/components/ln-http/ln-http.js +1 -0
- package/components/ln-http/ln-http.schema.json +6 -0
- package/components/ln-http/src/http-core.js +51 -0
- package/{js → components}/ln-http/src/ln-http.js +28 -33
- package/{js → components}/ln-icon/README.md +16 -9
- package/components/ln-icon/ln-icon.schema.json +6 -0
- package/components/ln-include/README.md +75 -0
- package/components/ln-include/ln-include-dev.scss +13 -0
- package/components/ln-include/ln-include.js +1 -0
- package/components/ln-include/ln-include.schema.json +23 -0
- package/components/ln-include/src/ln-include.js +111 -0
- package/components/ln-key/README.md +130 -0
- package/components/ln-key/ln-key-dev.scss +18 -0
- package/components/ln-key/ln-key.js +1 -0
- package/components/ln-key/ln-key.schema.json +56 -0
- package/components/ln-key/src/key-model.js +146 -0
- package/components/ln-key/src/ln-key.js +201 -0
- package/{js → components}/ln-link/README.md +7 -9
- package/components/ln-link/ln-link-dev.scss +8 -0
- package/components/ln-link/ln-link.js +1 -0
- package/components/ln-link/ln-link.schema.json +22 -0
- package/{js → components}/ln-link/src/ln-link.js +16 -11
- package/components/ln-list/README.md +152 -0
- package/components/ln-list/ln-list-dev.scss +8 -0
- package/components/ln-list/ln-list.js +1 -0
- package/components/ln-list/ln-list.schema.json +166 -0
- package/components/ln-list/ln-list.scss +25 -0
- package/{js → components}/ln-list/src/ln-list.js +1301 -1216
- package/{js → components}/ln-modal/README.md +13 -10
- package/components/ln-modal/ln-modal-dev.scss +18 -0
- package/components/ln-modal/ln-modal.js +1 -0
- package/components/ln-modal/ln-modal.schema.json +54 -0
- package/components/ln-modal/ln-modal.scss +51 -0
- package/{js → components}/ln-modal/src/ln-modal.js +164 -137
- package/{js → components}/ln-nav/README.md +11 -11
- package/components/ln-nav/ln-nav.js +1 -0
- package/components/ln-nav/ln-nav.schema.json +25 -0
- package/{js → components}/ln-nav/src/ln-nav.js +25 -14
- package/components/ln-number/README.md +205 -0
- package/{js → components}/ln-number/ln-number-dev.scss +13 -13
- package/components/ln-number/ln-number.js +1 -0
- package/components/ln-number/ln-number.schema.json +63 -0
- package/components/ln-number/src/ln-number.js +400 -0
- package/components/ln-number/src/number-model.js +31 -0
- package/components/ln-obfuscator/README.md +60 -0
- package/components/ln-obfuscator/ln-obfuscator.js +1 -0
- package/components/ln-obfuscator/ln-obfuscator.schema.json +49 -0
- package/components/ln-obfuscator/src/ln-obfuscator.js +159 -0
- package/components/ln-obfuscator/src/obfuscator-model.js +250 -0
- package/{js → components}/ln-options/README.md +3 -1
- package/components/ln-options/ln-options-dev.scss +13 -0
- package/components/ln-options/ln-options.js +1 -0
- package/components/ln-options/ln-options.schema.json +41 -0
- package/{js → components}/ln-options/src/ln-options.js +13 -5
- package/components/ln-persist/README.md +151 -0
- package/components/ln-persist/ln-persist.js +1 -0
- package/components/ln-persist/ln-persist.schema.json +28 -0
- package/components/ln-persist/src/ln-persist.js +83 -0
- package/components/ln-picklist/README.md +230 -0
- package/components/ln-picklist/ln-picklist-dev.scss +22 -0
- package/components/ln-picklist/ln-picklist.js +1 -0
- package/components/ln-picklist/ln-picklist.schema.json +49 -0
- package/components/ln-picklist/src/ln-picklist.js +228 -0
- package/{js → components}/ln-popover/README.md +164 -162
- package/components/ln-popover/ln-popover-dev.scss +13 -0
- package/components/ln-popover/ln-popover.js +1 -0
- package/components/ln-popover/ln-popover.schema.json +82 -0
- package/components/ln-popover/ln-popover.scss +18 -0
- package/{js → components}/ln-popover/src/ln-popover.js +42 -36
- package/{js → components}/ln-progress/README.md +410 -413
- package/components/ln-progress/ln-progress-dev.scss +8 -0
- package/components/ln-progress/ln-progress.js +1 -0
- package/components/ln-progress/ln-progress.schema.json +40 -0
- package/components/ln-progress/src/ln-progress.js +91 -0
- package/components/ln-progress/src/progress-model.js +20 -0
- package/{js → components}/ln-router/README.md +443 -432
- package/components/ln-router/ln-router-dev.scss +13 -0
- package/components/ln-router/ln-router.js +1 -0
- package/components/ln-router/ln-router.schema.json +68 -0
- package/{js → components}/ln-router/src/ln-router.js +585 -539
- package/components/ln-router/src/router-model.js +50 -0
- package/components/ln-scroll/README.md +45 -0
- package/components/ln-scroll/ln-scroll.js +1 -0
- package/components/ln-scroll/ln-scroll.schema.json +85 -0
- package/components/ln-scroll/src/ln-scroll.js +150 -0
- package/components/ln-search/README.md +188 -0
- package/components/ln-search/ln-search-dev.scss +13 -0
- package/components/ln-search/ln-search.js +1 -0
- package/components/ln-search/ln-search.schema.json +103 -0
- package/components/ln-search/src/ln-search.js +330 -0
- package/{js → components}/ln-slug/README.md +6 -3
- package/components/ln-slug/ln-slug-dev.scss +18 -0
- package/components/ln-slug/ln-slug.js +1 -0
- package/components/ln-slug/ln-slug.schema.json +23 -0
- package/{js → components}/ln-slug/src/ln-slug.js +20 -13
- package/components/ln-slug/src/slug-model.js +21 -0
- package/{js → components}/ln-sort/README.md +178 -170
- package/{js → components}/ln-sort/ln-sort-dev.scss +8 -8
- package/components/ln-sort/ln-sort.js +1 -0
- package/components/ln-sort/ln-sort.schema.json +104 -0
- package/components/ln-sort/src/ln-sort.js +321 -0
- package/components/ln-sort/src/sort-model.js +117 -0
- package/{js → components}/ln-sortable/README.md +7 -11
- package/components/ln-sortable/ln-sortable-dev.scss +13 -0
- package/components/ln-sortable/ln-sortable.js +1 -0
- package/components/ln-sortable/ln-sortable.schema.json +36 -0
- package/{js → components}/ln-sortable/src/ln-sortable.js +8 -13
- package/{js → components}/ln-stat/README.md +3 -1
- package/components/ln-stat/ln-stat-dev.scss +8 -0
- package/components/ln-stat/ln-stat.js +1 -0
- package/components/ln-stat/ln-stat.schema.json +32 -0
- package/{js → components}/ln-stat/src/ln-stat.js +14 -18
- package/components/ln-stat/src/stat-model.js +28 -0
- package/{js → components}/ln-table/README.md +37 -24
- package/{js → components}/ln-table/ln-table-dev.scss +17 -17
- package/components/ln-table/ln-table.js +1 -0
- package/components/ln-table/ln-table.schema.json +211 -0
- package/components/ln-table/ln-table.scss +15 -0
- package/{js → components}/ln-table/src/ln-table.js +1365 -1493
- package/components/ln-table/src/table-model.js +98 -0
- package/components/ln-table-coordinator/README.md +61 -0
- package/components/ln-table-coordinator/ln-table-coordinator.js +1 -0
- package/components/ln-table-coordinator/ln-table-coordinator.schema.json +93 -0
- package/components/ln-table-coordinator/src/ln-table-coordinator.js +193 -0
- package/{js → components}/ln-tabs/README.md +32 -14
- package/components/ln-tabs/ln-tabs-dev.scss +24 -0
- package/components/ln-tabs/ln-tabs.js +1 -0
- package/components/ln-tabs/ln-tabs.schema.json +75 -0
- package/components/ln-tabs/ln-tabs.scss +8 -0
- package/components/ln-tabs/src/ln-tabs.js +207 -0
- package/components/ln-tabs/src/tabs-model.js +82 -0
- package/{js → components}/ln-time/README.md +96 -95
- package/components/ln-time/ln-time-dev.scss +13 -0
- package/components/ln-time/ln-time.js +1 -0
- package/components/ln-time/ln-time.schema.json +38 -0
- package/{js → components}/ln-time/src/ln-time.js +206 -223
- package/components/ln-time/src/time-model.js +64 -0
- package/{js → components}/ln-toast/README.md +23 -5
- package/components/ln-toast/ln-toast-dev.scss +8 -0
- package/components/ln-toast/ln-toast.js +1 -0
- package/components/ln-toast/ln-toast.schema.json +65 -0
- package/components/ln-toast/ln-toast.scss +59 -0
- package/{js → components}/ln-toast/src/ln-toast.js +233 -232
- package/{js → components}/ln-toggle/README.md +198 -196
- package/{js → components}/ln-toggle/ln-toggle-dev.scss +13 -13
- package/components/ln-toggle/ln-toggle.js +1 -0
- package/components/ln-toggle/ln-toggle.schema.json +52 -0
- package/components/ln-toggle/ln-toggle.scss +37 -0
- package/{js → components}/ln-toggle/src/ln-toggle.js +61 -46
- package/{js → components}/ln-tooltip/README.md +6 -6
- package/{js → components}/ln-tooltip/ln-tooltip-dev.scss +9 -9
- package/components/ln-tooltip/ln-tooltip.js +1 -0
- package/components/ln-tooltip/ln-tooltip.schema.json +86 -0
- package/components/ln-tooltip/ln-tooltip.scss +9 -0
- package/{js → components}/ln-tooltip/src/ln-tooltip.js +14 -3
- package/{js → components}/ln-translations/README.md +3 -1
- package/components/ln-translations/ln-translations-dev.scss +13 -0
- package/components/ln-translations/ln-translations.js +1 -0
- package/components/ln-translations/ln-translations.schema.json +120 -0
- package/{js → components}/ln-translations/src/ln-translations.js +25 -10
- package/components/ln-ui-coordinator/README.md +101 -0
- package/components/ln-ui-coordinator/ln-ui-coordinator-dev.scss +8 -0
- package/components/ln-ui-coordinator/ln-ui-coordinator.js +1 -0
- package/components/ln-ui-coordinator/ln-ui-coordinator.schema.json +60 -0
- package/{js/ln-modal-coordinator/src/ln-modal-coordinator.js → components/ln-ui-coordinator/src/ln-ui-coordinator.js} +403 -345
- package/components/ln-upload/README.md +133 -0
- package/components/ln-upload/ln-upload-dev.scss +18 -0
- package/components/ln-upload/ln-upload.js +1 -0
- package/components/ln-upload/ln-upload.schema.json +193 -0
- package/components/ln-upload/ln-upload.scss +20 -0
- package/components/ln-upload/src/ln-upload.js +652 -0
- package/components/ln-upload/src/upload-model.js +78 -0
- package/{js → components}/ln-validate/README.md +182 -180
- package/{js → components}/ln-validate/ln-validate-dev.scss +15 -15
- package/components/ln-validate/ln-validate.js +1 -0
- package/components/ln-validate/ln-validate.schema.json +50 -0
- package/components/ln-validate/ln-validate.scss +7 -0
- package/{js → components}/ln-validate/src/ln-validate.js +23 -45
- package/components/ln-validate/src/validate-model.js +64 -0
- package/components/ln-websocket-connector/README.md +166 -0
- package/components/ln-websocket-connector/ln-websocket-connector.js +1 -0
- package/components/ln-websocket-connector/ln-websocket-connector.schema.json +29 -0
- package/components/ln-websocket-connector/src/ln-websocket-connector.js +279 -0
- package/ln-ashlar.html-data.json +1796 -0
- package/package.json +84 -61
- package/{scss → theme}/base/_global.scss +1 -2
- package/{scss → theme}/base/_reset.scss +1 -1
- package/{scss → theme}/base/_typography.scss +2 -0
- package/theme/brand.css +73 -0
- package/{scss → theme}/components/_app-shell.scss +8 -0
- package/theme/components/_button.scss +24 -0
- package/theme/components/_chart.scss +5 -0
- package/theme/components/_confirm.scss +6 -0
- package/{scss → theme}/components/_date.scss +30 -22
- package/{scss → theme}/components/_dropdown.scss +6 -1
- package/theme/components/_form.scss +140 -0
- package/{scss → theme}/components/_layout.scss +6 -0
- package/{scss → theme}/components/_ln-table.scss +1 -6
- package/theme/components/_picklist.scss +3 -0
- package/{scss → theme}/components/_sort.scss +10 -10
- package/theme/components/_status-badge.scss +6 -0
- package/{scss → theme}/components/_table.scss +16 -0
- package/{scss → theme}/components/_tabs.scss +0 -4
- package/theme/components/_toast.scss +48 -0
- package/{scss → theme}/components/_toggle.scss +1 -1
- package/theme/components/_upload.scss +45 -0
- package/{scss → theme}/config/_breakpoints.scss +1 -1
- package/theme/config/_contrast.scss +128 -0
- package/{scss → theme}/config/_density.scss +191 -205
- package/theme/config/_palette.scss +274 -0
- package/theme/config/_theme.scss +293 -0
- package/{scss → theme}/config/_tokens.scss +285 -441
- package/{scss → theme}/config/mixins/_accordion.scss +1 -1
- package/{scss → theme}/config/mixins/_alert.scss +1 -0
- package/{scss → theme}/config/mixins/_app-shell.scss +4 -2
- package/{scss → theme}/config/mixins/_borders.scss +2 -0
- package/theme/config/mixins/_btn.scss +175 -0
- package/{scss → theme}/config/mixins/_card.scss +55 -46
- package/theme/config/mixins/_chart.scss +82 -0
- package/{scss → theme}/config/mixins/_collapsible.scss +2 -1
- package/{scss → theme}/config/mixins/_colors.scss +8 -14
- package/{scss → theme}/config/mixins/_diagnostics.scss +48 -48
- package/theme/config/mixins/_dropdown.scss +169 -0
- package/{scss → theme}/config/mixins/_editor.scss +0 -7
- package/{scss → theme}/config/mixins/_filter.scss +47 -47
- package/{scss → theme}/config/mixins/_footer.scss +1 -1
- package/{scss → theme}/config/mixins/_form.scss +49 -18
- package/{scss → theme}/config/mixins/_index.scss +62 -61
- package/{scss → theme}/config/mixins/_layout.scss +6 -2
- package/{scss → theme}/config/mixins/_ln-table.scss +31 -10
- package/{scss → theme}/config/mixins/_loader.scss +1 -1
- package/{scss → theme}/config/mixins/_modal.scss +145 -149
- package/{scss → theme}/config/mixins/_motion.scss +13 -0
- package/{scss → theme}/config/mixins/_nav.scss +7 -7
- package/theme/config/mixins/_picklist.scss +66 -0
- package/theme/config/mixins/_popover.scss +96 -0
- package/{scss → theme}/config/mixins/_sidebar.scss +7 -4
- package/{scss → theme}/config/mixins/_sort.scss +43 -42
- package/{scss → theme}/config/mixins/_status-badge.scss +15 -2
- package/{scss → theme}/config/mixins/_table.scss +25 -14
- package/{scss → theme}/config/mixins/_tabs.scss +1 -1
- package/{scss → theme}/config/mixins/_toast.scss +174 -179
- package/{scss → theme}/config/mixins/_tooltip.scss +2 -2
- package/{scss → theme}/config/mixins/_typography.scss +16 -5
- package/{scss → theme}/config/mixins/_upload.scss +8 -6
- package/theme/ln-ashlar-core.scss +24 -0
- package/theme/ln-ashlar-dev.scss +66 -0
- package/theme/ln-ashlar-landing.scss +56 -0
- package/{scss/ln-ashlar.scss → theme/ln-ashlar-theme.scss} +63 -69
- package/theme/ln-ashlar.scss +8 -0
- package/theme/presentation/_bento.scss +151 -0
- package/theme/presentation/_cta.scss +111 -0
- package/theme/presentation/_effects.scss +216 -0
- package/theme/presentation/_features.scss +108 -0
- package/theme/presentation/_footer.scss +129 -0
- package/theme/presentation/_hero.scss +158 -0
- package/theme/presentation/_layout.scss +170 -0
- package/theme/presentation/_navbar.scss +140 -0
- package/theme/presentation/_pricing.scss +262 -0
- package/theme/presentation/_stats.scss +87 -0
- package/theme/presentation/_testimonials.scss +124 -0
- package/theme/presentation/_tokens.scss +39 -0
- package/theme/presentation/_typography.scss +163 -0
- package/{scss → theme}/utilities/_animations.scss +38 -0
- package/{scss → theme}/utilities/_utilities.scss +6 -0
- package/web-types.json +2312 -0
- package/js/ln-accordion/ln-accordion.js +0 -1
- package/js/ln-ajax/ln-ajax.js +0 -1
- package/js/ln-api-connector/ln-api-connector.js +0 -1
- package/js/ln-api-connector/src/ln-api-connector.js +0 -368
- package/js/ln-api-queue/ln-api-queue.js +0 -1
- package/js/ln-autoresize/ln-autoresize.js +0 -1
- package/js/ln-autosave/ln-autosave.js +0 -1
- package/js/ln-circular-progress/ln-circular-progress.js +0 -1
- package/js/ln-confirm/_ln-confirm.scss +0 -24
- package/js/ln-confirm/ln-confirm.js +0 -1
- package/js/ln-core/crypto.js +0 -83
- package/js/ln-core/helpers.js +0 -788
- package/js/ln-core/index.js +0 -7
- package/js/ln-core/persist.js +0 -97
- package/js/ln-couchdb-connector/ln-couchdb-connector.js +0 -1
- package/js/ln-data-coordinator/ln-data-coordinator.js +0 -1
- package/js/ln-data-coordinator/src/data-read-policy.js +0 -18
- package/js/ln-data-store/ln-data-store.js +0 -1
- package/js/ln-date/ln-date.js +0 -1
- package/js/ln-date/src/ln-date.js +0 -603
- package/js/ln-debug/README.md +0 -58
- package/js/ln-debug/ln-debug.js +0 -1
- package/js/ln-debug/src/ln-debug.js +0 -19
- package/js/ln-dropdown/ln-dropdown.js +0 -1
- package/js/ln-dropdown/ln-dropdown.scss +0 -15
- package/js/ln-editor/ln-editor.js +0 -1
- package/js/ln-editor/ln-editor.scss +0 -43
- package/js/ln-external-links/ln-external-links.js +0 -1
- package/js/ln-fill/ln-fill.js +0 -1
- package/js/ln-filter/README.md +0 -189
- package/js/ln-filter/ln-filter-dev.scss +0 -8
- package/js/ln-filter/ln-filter.js +0 -1
- package/js/ln-filter/src/ln-filter.js +0 -419
- package/js/ln-form/ln-form.js +0 -1
- package/js/ln-http/ln-http.js +0 -1
- package/js/ln-link/ln-link.js +0 -1
- package/js/ln-list/README.md +0 -129
- package/js/ln-list/ln-list.js +0 -1
- package/js/ln-list/ln-list.scss +0 -28
- package/js/ln-modal/ln-modal-dev.scss +0 -13
- package/js/ln-modal/ln-modal.js +0 -1
- package/js/ln-modal/ln-modal.scss +0 -35
- package/js/ln-modal-coordinator/README.md +0 -99
- package/js/ln-modal-coordinator/ln-modal-coordinator-dev.scss +0 -8
- package/js/ln-modal-coordinator/ln-modal-coordinator.js +0 -1
- package/js/ln-nav/ln-nav.js +0 -1
- package/js/ln-number/README.md +0 -149
- package/js/ln-number/ln-number.js +0 -1
- package/js/ln-number/src/ln-number.js +0 -443
- package/js/ln-options/ln-options.js +0 -1
- package/js/ln-popover/ln-popover.js +0 -1
- package/js/ln-progress/ln-progress.js +0 -1
- package/js/ln-progress/src/ln-progress.js +0 -98
- package/js/ln-router/ln-router.js +0 -1
- package/js/ln-search/README.md +0 -158
- package/js/ln-search/ln-search-dev.scss +0 -8
- package/js/ln-search/ln-search.js +0 -1
- package/js/ln-search/src/ln-search.js +0 -117
- package/js/ln-slug/ln-slug.js +0 -1
- package/js/ln-sort/ln-sort.js +0 -1
- package/js/ln-sort/src/ln-sort.js +0 -178
- package/js/ln-sortable/ln-sortable.js +0 -1
- package/js/ln-stat/ln-stat.js +0 -1
- package/js/ln-table/ln-table.js +0 -1
- package/js/ln-table/ln-table.scss +0 -11
- package/js/ln-table-coordinator/README.md +0 -73
- package/js/ln-table-coordinator/ln-table-coordinator.js +0 -1
- package/js/ln-table-coordinator/src/ln-table-coordinator.js +0 -160
- package/js/ln-tabs/ln-tabs-dev.scss +0 -18
- package/js/ln-tabs/ln-tabs.js +0 -1
- package/js/ln-tabs/src/ln-tabs.js +0 -188
- package/js/ln-time/ln-time.js +0 -1
- package/js/ln-toast/ln-toast.js +0 -1
- package/js/ln-toggle/ln-toggle.js +0 -1
- package/js/ln-tooltip/ln-tooltip.js +0 -1
- package/js/ln-tooltip/ln-tooltip.scss +0 -9
- package/js/ln-translations/ln-translations.js +0 -1
- package/js/ln-upload/README.md +0 -255
- package/js/ln-upload/ln-upload.js +0 -1
- package/js/ln-upload/ln-upload.scss +0 -20
- package/js/ln-upload/src/ln-upload.js +0 -423
- package/js/ln-validate/ln-validate.js +0 -1
- package/scss/components/_button.scss +0 -20
- package/scss/components/_confirm.scss +0 -5
- package/scss/components/_form.scss +0 -107
- package/scss/components/_status-badge.scss +0 -4
- package/scss/components/_toast.scss +0 -68
- package/scss/components/_upload.scss +0 -51
- package/scss/config/_theme.scss +0 -216
- package/scss/config/mixins/_btn.scss +0 -179
- package/scss/config/mixins/_confirm.scss +0 -31
- package/scss/config/mixins/_dropdown.scss +0 -141
- package/scss/config/mixins/_popover.scss +0 -64
- package/scss/ln-ashlar-dev.scss +0 -39
- /package/{js → components}/ln-core/positioning.js +0 -0
- /package/{js → components}/ln-core/reactive.js +0 -0
- /package/{js → components}/ln-filter/ln-filter.scss +0 -0
- /package/{js → components}/ln-icon/ln-icon.js +0 -0
- /package/{js → components}/ln-icon/src/ln-icon.js +0 -0
- /package/{js → components}/ln-search/ln-search.scss +0 -0
- /package/{js → components}/ln-toast/template.html +0 -0
- /package/{scss → theme}/components/_accordion.scss +0 -0
- /package/{scss → theme}/components/_ajax.scss +0 -0
- /package/{scss → theme}/components/_alert.scss +0 -0
- /package/{scss → theme}/components/_avatar.scss +0 -0
- /package/{scss → theme}/components/_breadcrumbs.scss +0 -0
- /package/{scss → theme}/components/_card.scss +0 -0
- /package/{scss → theme}/components/_chip.scss +0 -0
- /package/{scss → theme}/components/_circular-progress.scss +0 -0
- /package/{scss → theme}/components/_editor.scss +0 -0
- /package/{scss → theme}/components/_empty-state.scss +0 -0
- /package/{scss → theme}/components/_filter.scss +0 -0
- /package/{scss → theme}/components/_link.scss +0 -0
- /package/{scss → theme}/components/_loader.scss +0 -0
- /package/{scss → theme}/components/_modal.scss +0 -0
- /package/{scss → theme}/components/_nav.scss +0 -0
- /package/{scss → theme}/components/_page-header.scss +0 -0
- /package/{scss → theme}/components/_popover.scss +0 -0
- /package/{scss → theme}/components/_progress.scss +0 -0
- /package/{scss → theme}/components/_prose.scss +0 -0
- /package/{scss → theme}/components/_scrollbar.scss +0 -0
- /package/{scss → theme}/components/_sections.scss +0 -0
- /package/{scss → theme}/components/_sidebar.scss +0 -0
- /package/{scss → theme}/components/_stat-card.scss +0 -0
- /package/{scss → theme}/components/_stepper.scss +0 -0
- /package/{scss → theme}/components/_timeline.scss +0 -0
- /package/{scss → theme}/components/_tooltip.scss +0 -0
- /package/{scss → theme}/components/_translations.scss +0 -0
- /package/{scss → theme}/config/_icons.scss +0 -0
- /package/{scss → theme}/config/_mixins.scss +0 -0
- /package/{scss → theme}/config/mixins/_ajax.scss +0 -0
- /package/{scss → theme}/config/mixins/_avatar.scss +0 -0
- /package/{scss → theme}/config/mixins/_breadcrumbs.scss +0 -0
- /package/{scss → theme}/config/mixins/_breakpoints.scss +0 -0
- /package/{scss → theme}/config/mixins/_chip.scss +0 -0
- /package/{scss → theme}/config/mixins/_circular-progress.scss +0 -0
- /package/{scss → theme}/config/mixins/_display.scss +0 -0
- /package/{scss → theme}/config/mixins/_empty-state.scss +0 -0
- /package/{scss → theme}/config/mixins/_focus.scss +0 -0
- /package/{scss → theme}/config/mixins/_interaction.scss +0 -0
- /package/{scss → theme}/config/mixins/_kbd.scss +0 -0
- /package/{scss → theme}/config/mixins/_link.scss +0 -0
- /package/{scss → theme}/config/mixins/_page-header.scss +0 -0
- /package/{scss → theme}/config/mixins/_position.scss +0 -0
- /package/{scss → theme}/config/mixins/_progress.scss +0 -0
- /package/{scss → theme}/config/mixins/_prose.scss +0 -0
- /package/{scss → theme}/config/mixins/_shadows.scss +0 -0
- /package/{scss → theme}/config/mixins/_sizing.scss +0 -0
- /package/{scss → theme}/config/mixins/_spacing.scss +0 -0
- /package/{scss → theme}/config/mixins/_stat-card.scss +0 -0
- /package/{scss → theme}/config/mixins/_stepper.scss +0 -0
- /package/{scss → theme}/config/mixins/_timeline.scss +0 -0
- /package/{scss → theme}/config/mixins/_transitions.scss +0 -0
- /package/{scss → theme}/config/mixins/_translations.scss +0 -0
- /package/{scss → theme}/tabler-icons.txt +0 -0
package/js/ln-time/ln-time.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(function(){"use strict";if(typeof window<"u"){const t=console.warn;console.warn=function(...e){typeof e[0]=="string"&&(e[0].startsWith("[ln-")||e[0].startsWith("[lnCore"))&&!(document.documentElement.hasAttribute("data-ln-debug")||document.body&&document.body.hasAttribute("data-ln-debug"))||t.apply(console,e)}}const T={};function G(t,e){T[t]||(T[t]=document.querySelector('[data-ln-template="'+t+'"]'));const r=T[t];return r?r.content.cloneNode(!0):(console.warn("["+(e||"ln-core")+'] Template "'+t+'" not found'),null)}function N(t,e){if(!t||!e)return t;const r=t.querySelectorAll("[data-ln-field]");for(let i=0;i<r.length;i++){const o=r[i],l=o.getAttribute("data-ln-field");e[l]!=null&&(o.textContent=e[l])}const u=t.querySelectorAll("[data-ln-attr]");for(let i=0;i<u.length;i++){const o=u[i],l=o.getAttribute("data-ln-attr").split(",");for(let c=0;c<l.length;c++){const f=l[c].trim().split(":");if(f.length!==2)continue;const g=f[0].trim(),m=f[1].trim();e[m]!=null&&o.setAttribute(g,e[m])}}const d=t.querySelectorAll("[data-ln-show]");for(let i=0;i<d.length;i++){const o=d[i],l=o.getAttribute("data-ln-show");l in e&&o.classList.toggle("hidden",!e[l])}const a=t.querySelectorAll("[data-ln-class]");for(let i=0;i<a.length;i++){const o=a[i],l=o.getAttribute("data-ln-class").split(",");for(let c=0;c<l.length;c++){const f=l[c].trim().split(":");if(f.length!==2)continue;const g=f[0].trim(),m=f[1].trim();m in e&&o.classList.toggle(g,!!e[m])}}return t}function P(t,e){t.matches&&t.matches("[data-ln-form], [data-ln-fillable]")&&t.dispatchEvent(new CustomEvent("ln-fill",{detail:e??null,bubbles:!0}));const r=t.querySelectorAll("[data-ln-form], [data-ln-fillable]");for(let u=0;u<r.length;u++)r[u].dispatchEvent(new CustomEvent("ln-fill",{detail:e??null,bubbles:!0}));return t}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._fillBound||(window.lnCore._fillBound=!0,document.addEventListener("ln-fill",function(t){if(!(!t.target.matches||!t.target.matches("[data-ln-fillable]")))if(t.detail)N(t.target,t.detail);else{const e=t.target.querySelectorAll("[data-ln-field]");for(let r=0;r<e.length;r++)e[r].textContent=""}})));function R(t,e){if(!t||!e)return t;const r=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);for(;r.nextNode();){const a=r.currentNode;a.textContent.indexOf("{{")!==-1&&(a.textContent=a.textContent.replace(/\{\{\s*(\w+)\s*\}\}/g,function(i,o){return e[o]!==void 0?e[o]:""}))}const u=function(a,i){return e[i]!==void 0?e[i]:""},d=Array.from(t.querySelectorAll("*"));t.nodeType===1&&d.push(t);for(let a=0;a<d.length;a++){const i=d[a],o=i.attributes;for(let l=0;l<o.length;l++){const c=o[l];c.value.indexOf("{{")!==-1&&i.setAttribute(c.name,c.value.replace(/\{\{\s*(\w+)\s*\}\}/g,u))}}return t}function z(t,e,r,u,d,a){const i={};for(let l=0;l<t.children.length;l++){const c=t.children[l],f=c.getAttribute("data-ln-key");f&&(i[f]=c)}const o=document.createDocumentFragment();for(let l=0;l<e.length;l++){const c=e[l],f=String(u(c));let g=i[f];if(g)d(g,c,l);else{const m=G(r,a);if(!m||(R(m,c),g=m.firstElementChild,!g))continue;g.setAttribute("data-ln-key",f),d(g,c,l)}o.appendChild(g)}t.textContent="",t.appendChild(o)}function j(t,e){if(!document.body){document.addEventListener("DOMContentLoaded",function(){j(t,e)}),console.warn("["+e+'] Script loaded before <body> — add "defer" to your <script> tag');return}t()}function E(t,e,r,u){if(t.nodeType!==1)return;const a=e.indexOf("[")!==-1||e.indexOf(".")!==-1||e.indexOf("#")!==-1?e:"["+e+"]",i=Array.from(t.querySelectorAll(a));t.matches&&t.matches(a)&&i.push(t);for(const o of i)o[r]||(o[r]=new u(o))}const $={mk:"mk-MK",de:"de-DE",fr:"fr-FR",es:"es-ES",it:"it-IT",nl:"nl-NL",pt:"pt-PT",ru:"ru-RU",bg:"bg-BG",hr:"hr-HR",sr:"sr-RS",sq:"sq-AL",el:"el-GR",en:"en-US"};function H(t){const e=t?t.closest("[lang]"):null,r=(e?e.getAttribute("lang")||e.lang:null)||(document.documentElement?document.documentElement.getAttribute("lang")||document.documentElement.lang:null)||navigator.language;if(!r)return"en-US";const u=r.trim().toLowerCase();return u.indexOf("-")===-1&&$[u]?$[u]:r}function J(t,e,r,u,d={}){const a=d.extraAttributes||[],i=d.onAttributeChange||null,o=d.onInit||null;function l(c){const f=c||document.body;E(f,t,e,r),o&&o(f)}return j(function(){const c=new MutationObserver(function(g){for(let m=0;m<g.length;m++){const y=g[m];if(y.type==="childList"){for(let v=0;v<y.addedNodes.length;v++){const A=y.addedNodes[v];A.nodeType===1&&(E(A,t,e,r),o&&o(A))}for(let v=0;v<y.removedNodes.length;v++){const A=y.removedNodes[v];if(A.nodeType===1){const L=t.indexOf("[")!==-1||t.indexOf(".")!==-1||t.indexOf("#")!==-1?t:"["+t+"]",x=Array.from(A.querySelectorAll(L));A.matches&&A.matches(L)&&x.push(A);for(let _=0;_<x.length;_++){const O=x[_];if(!document.contains(O)){const k=O[e];k&&typeof k.destroy=="function"&&k.destroy()}}}}}else y.type==="attributes"&&(i&&y.target[e]?i(y.target,y.attributeName):(E(y.target,t,e,r),o&&o(y.target)))}});let f=[];if(t.indexOf("[")!==-1){const g=/\[([\w-]+)/g;let m;for(;(m=g.exec(t))!==null;)f.push(m[1])}else f.push(t);c.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:f.concat(a)})},u),window[e]=l,document.readyState==="loading"?document.addEventListener("DOMContentLoaded",function(){l(document.body)}):l(document.body),l}const W={};function X(t,e){W[t]=e}function Q(t){return W[t]||{ingress:e=>e,egress:e=>e}}const B={};function U(t,e){if(!t||typeof e!="object")return;const r=t.toLowerCase().split("-")[0];B[r]=e}function M(t){if(!t)return null;const e=t.toLowerCase().split("-")[0];return B[e]||null}U("mk",{monthsLong:["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"],monthsShort:["јан","фев","мар","апр","мај","јун","јул","авг","септ","окт","ноем","дек"],daysLong:["недела","понеделник","вторник","среда","четврток","петок","сабота"],daysShort:["нед","пон","вт","ср","чет","пет","саб"]}),typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerDataMapper=X,window.lnCore.getDataMapper=Q,window.lnCore.registerLocaleFallback=U,window.lnCore.getLocaleFallback=M,window.lnCore.fillTemplate=R,window.lnCore.fill=N,window.lnCore.lnFill=P,window.lnCore.renderList=z);function Y(t){return(t||"").replace(/^#/,"")}function D(t){const e=t===void 0?location.hash:t,r={},u=Y(e);if(!u)return r;const d=u.split("&");for(let a=0;a<d.length;a++){const i=d[a];if(!i)continue;const o=i.indexOf(":"),l=o>-1?i.slice(0,o):i,c=o>-1?i.slice(o+1):"";if(l)try{r[l]=decodeURIComponent(c)}catch{r[l]=c}}return r}function V(t){if(!t)return null;const e=D();return t in e?e[t]:null}function Z(t,e){if(!t)return;const r=D();e==null?delete r[t]:r[t]=String(e);const d=Object.keys(r).map(function(a){const i=r[a];return i===""?a:a+":"+encodeURIComponent(i)}).join("&");Y(location.hash)!==d&&(location.hash=d)}function tt(t){return t.button===1||t.ctrlKey||t.metaKey||t.shiftKey?!1:(t.preventDefault(),!0)}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.hashParse=D,window.lnCore.hashGet=V,window.lnCore.hashSet=Z,window.lnCore.hashLinkClick=tt),(function(){const t="data-ln-time",e="lnTime";if(window[e]!==void 0)return;const r={},u={};function d(n){return n.getAttribute("data-ln-time-locale")||H(n)}function a(n,s){const h=(n||"")+"|"+JSON.stringify(s);return r[h]||(r[h]=new Intl.DateTimeFormat(n,s)),r[h]}function i(n){const s=n||"";return u[s]||(u[s]=new Intl.RelativeTimeFormat(n,{numeric:"auto",style:"narrow"})),u[s]}const o=new Set;let l=null;function c(){l||(l=setInterval(g,6e4))}function f(){l&&(clearInterval(l),l=null)}function g(){for(const n of o){if(!document.body.contains(n.dom)){o.delete(n);continue}L(n)}o.size===0&&f()}function m(n,s){const h=M(s),C=(s||"").toLowerCase().split("-")[0],b=a(s,{dateStyle:"long",timeStyle:"short"}),w=b.resolvedOptions().locale.toLowerCase().split("-")[0];if(h&&w!==C&&h.monthsLong){const p=h.monthsLong[n.getMonth()],S=n.getDate(),F=n.getFullYear(),q=String(n.getHours()).padStart(2,"0"),I=String(n.getMinutes()).padStart(2,"0");return`${S} ${p} ${F} во ${q}:${I}`}return b.format(n)}function y(n,s){const h=new Date,C={month:"short",day:"numeric"};n.getFullYear()!==h.getFullYear()&&(C.year="numeric");const b=M(s),w=(s||"").toLowerCase().split("-")[0],p=a(s,C),S=p.resolvedOptions().locale.toLowerCase().split("-")[0];if(b&&S!==w&&b.monthsShort){const F=b.monthsShort[n.getMonth()],q=n.getDate(),I=n.getFullYear()!==h.getFullYear()?" "+n.getFullYear():"";return`${q} ${F}${I}`}return p.format(n)}function v(n,s){return a(s,{dateStyle:"medium"}).format(n)}function A(n,s){return a(s,{timeStyle:"short"}).format(n)}function K(n,s){const h=Math.floor(Date.now()/1e3),b=Math.floor(n.getTime()/1e3)-h,w=Math.abs(b);if(w<10)return i(s).format(0,"second");let p,S;if(w<60)p="second",S=b;else if(w<3600)p="minute",S=Math.round(b/60);else if(w<86400)p="hour",S=Math.round(b/3600);else if(w<604800)p="day",S=Math.round(b/86400);else if(w<2592e3)p="week",S=Math.round(b/604800);else return y(n,s);return i(s).format(S,p)}function L(n){const s=n.dom.getAttribute("datetime");if(!s)return;const h=Number(s);if(isNaN(h))return;const C=new Date(h*1e3),b=n.dom.getAttribute(t)||"short",w=d(n.dom);let p;switch(b){case"relative":p=K(C,w);break;case"full":p=m(C,w);break;case"date":p=v(C,w);break;case"time":p=A(C,w);break;default:p=y(C,w);break}n.dom.textContent=p,b!=="full"&&(n.dom.title=m(C,w))}function x(n){return this.dom=n,L(this),n.getAttribute(t)==="relative"&&(o.add(this),c()),this}x.prototype.render=function(){L(this)},x.prototype.destroy=function(){o.delete(this),o.size===0&&f(),delete this.dom[e]};function _(n){const s=n[e];if(!s)return;n.getAttribute(t)==="relative"?(o.add(s),c()):(o.delete(s),o.size===0&&f()),L(s)}function O(n){n.nodeType===1&&n.hasAttribute&&n.hasAttribute(t)&&n[e]&&L(n[e])}function k(){new MutationObserver(function(){const n=document.querySelectorAll("["+t+"]");for(let s=0;s<n.length;s++){const h=n[s][e];h&&L(h)}}).observe(document.documentElement,{attributes:!0,attributeFilter:["lang"],subtree:!0})}J(t,e,x,"ln-time",{extraAttributes:["datetime","data-ln-time-locale","lang"],onAttributeChange:_,onInit:O}),k()})()})();
|
package/js/ln-toast/ln-toast.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(function(){"use strict";if(typeof window<"u"){const t=console.warn;console.warn=function(...n){typeof n[0]=="string"&&(n[0].startsWith("[ln-")||n[0].startsWith("[lnCore"))&&!(document.documentElement.hasAttribute("data-ln-debug")||document.body&&document.body.hasAttribute("data-ln-debug"))||t.apply(console,n)}}const b={};function L(t,n){b[t]||(b[t]=document.querySelector('[data-ln-template="'+t+'"]'));const i=b[t];return i?i.content.cloneNode(!0):(console.warn("["+(n||"ln-core")+'] Template "'+t+'" not found'),null)}function C(t,n){if(!t||!n)return t;const i=t.querySelectorAll("[data-ln-field]");for(let r=0;r<i.length;r++){const a=i[r],s=a.getAttribute("data-ln-field");n[s]!=null&&(a.textContent=n[s])}const f=t.querySelectorAll("[data-ln-attr]");for(let r=0;r<f.length;r++){const a=f[r],s=a.getAttribute("data-ln-attr").split(",");for(let u=0;u<s.length;u++){const m=s[u].trim().split(":");if(m.length!==2)continue;const y=m[0].trim(),w=m[1].trim();n[w]!=null&&a.setAttribute(y,n[w])}}const p=t.querySelectorAll("[data-ln-show]");for(let r=0;r<p.length;r++){const a=p[r],s=a.getAttribute("data-ln-show");s in n&&a.classList.toggle("hidden",!n[s])}const c=t.querySelectorAll("[data-ln-class]");for(let r=0;r<c.length;r++){const a=c[r],s=a.getAttribute("data-ln-class").split(",");for(let u=0;u<s.length;u++){const m=s[u].trim().split(":");if(m.length!==2)continue;const y=m[0].trim(),w=m[1].trim();w in n&&a.classList.toggle(y,!!n[w])}}return t}function k(t,n){t.matches&&t.matches("[data-ln-form], [data-ln-fillable]")&&t.dispatchEvent(new CustomEvent("ln-fill",{detail:n??null,bubbles:!0}));const i=t.querySelectorAll("[data-ln-form], [data-ln-fillable]");for(let f=0;f<i.length;f++)i[f].dispatchEvent(new CustomEvent("ln-fill",{detail:n??null,bubbles:!0}));return t}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._fillBound||(window.lnCore._fillBound=!0,document.addEventListener("ln-fill",function(t){if(!(!t.target.matches||!t.target.matches("[data-ln-fillable]")))if(t.detail)C(t.target,t.detail);else{const n=t.target.querySelectorAll("[data-ln-field]");for(let i=0;i<n.length;i++)n[i].textContent=""}})));function _(t,n){if(!t||!n)return t;const i=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);for(;i.nextNode();){const c=i.currentNode;c.textContent.indexOf("{{")!==-1&&(c.textContent=c.textContent.replace(/\{\{\s*(\w+)\s*\}\}/g,function(r,a){return n[a]!==void 0?n[a]:""}))}const f=function(c,r){return n[r]!==void 0?n[r]:""},p=Array.from(t.querySelectorAll("*"));t.nodeType===1&&p.push(t);for(let c=0;c<p.length;c++){const r=p[c],a=r.attributes;for(let s=0;s<a.length;s++){const u=a[s];u.value.indexOf("{{")!==-1&&r.setAttribute(u.name,u.value.replace(/\{\{\s*(\w+)\s*\}\}/g,f))}}return t}function N(t,n,i,f,p,c){const r={};for(let s=0;s<t.children.length;s++){const u=t.children[s],m=u.getAttribute("data-ln-key");m&&(r[m]=u)}const a=document.createDocumentFragment();for(let s=0;s<n.length;s++){const u=n[s],m=String(f(u));let y=r[m];if(y)p(y,u,s);else{const w=L(i,c);if(!w||(_(w,u),y=w.firstElementChild,!y))continue;y.setAttribute("data-ln-key",m),p(y,u,s)}a.appendChild(y)}t.textContent="",t.appendChild(a)}function v(t,n){if(!document.body){document.addEventListener("DOMContentLoaded",function(){v(t,n)}),console.warn("["+n+'] Script loaded before <body> — add "defer" to your <script> tag');return}t()}function D(t,n,i){if(t){const f=t.querySelector('[data-ln-template="'+n+'"]');if(f)return f.content.cloneNode(!0)}return L(n,i)}const S={};function M(t,n){S[t]=n}function F(t){return S[t]||{ingress:n=>n,egress:n=>n}}const E={};function T(t,n){if(!t||typeof n!="object")return;const i=t.toLowerCase().split("-")[0];E[i]=n}function O(t){if(!t)return null;const n=t.toLowerCase().split("-")[0];return E[n]||null}T("mk",{monthsLong:["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"],monthsShort:["јан","фев","мар","апр","мај","јун","јул","авг","септ","окт","ноем","дек"],daysLong:["недела","понеделник","вторник","среда","четврток","петок","сабота"],daysShort:["нед","пон","вт","ср","чет","пет","саб"]}),typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerDataMapper=M,window.lnCore.getDataMapper=F,window.lnCore.registerLocaleFallback=T,window.lnCore.getLocaleFallback=O,window.lnCore.fillTemplate=_,window.lnCore.fill=C,window.lnCore.lnFill=k,window.lnCore.renderList=N);function q(t){return(t||"").replace(/^#/,"")}function A(t){const n=t===void 0?location.hash:t,i={},f=q(n);if(!f)return i;const p=f.split("&");for(let c=0;c<p.length;c++){const r=p[c];if(!r)continue;const a=r.indexOf(":"),s=a>-1?r.slice(0,a):r,u=a>-1?r.slice(a+1):"";if(s)try{i[s]=decodeURIComponent(u)}catch{i[s]=u}}return i}function I(t){if(!t)return null;const n=A();return t in n?n[t]:null}function B(t,n){if(!t)return;const i=A();n==null?delete i[t]:i[t]=String(n);const p=Object.keys(i).map(function(c){const r=i[c];return r===""?c:c+":"+encodeURIComponent(r)}).join("&");q(location.hash)!==p&&(location.hash=p)}function j(t){return t.button===1||t.ctrlKey||t.metaKey||t.shiftKey?!1:(t.preventDefault(),!0)}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.hashParse=A,window.lnCore.hashGet=I,window.lnCore.hashSet=B,window.lnCore.hashLinkClick=j),(function(){const t="data-ln-toast",n="lnToast",i="ln-toast-item";if(window.__lnToastLoaded)return;window.__lnToastLoaded=!0;function f(e){if(!(!e||!(e instanceof HTMLElement))&&(e.hasAttribute("popover")||e.setAttribute("popover","manual"),typeof e.showPopover=="function")){if(e.matches(":popover-open"))try{e.hidePopover()}catch{}try{e.showPopover()}catch{}}}function p(e){if(!e||!(e instanceof HTMLElement))return;if(e.querySelectorAll("[data-ln-toast-item]").length===0&&typeof e.hidePopover=="function"&&e.matches(":popover-open"))try{e.hidePopover()}catch{}}function c(e){if(!e||e.nodeType!==1)return;const o=Array.from(e.querySelectorAll("["+t+"]"));e.hasAttribute&&e.hasAttribute(t)&&o.push(e);for(const l of o)l[n]||new r(l)}function r(e){this.dom=e,e[n]=this,this.timeoutDefault=parseInt(e.getAttribute("data-ln-toast-timeout")||"6000",10),this.max=parseInt(e.getAttribute("data-ln-toast-max")||"5",10);const o=Array.from(e.querySelectorAll("[data-ln-toast-item]"));for(;o.length>this.max;)e.removeChild(o.shift());for(const l of o)w(l,this);return o.length>0&&f(e),this}r.prototype.destroy=function(){if(this.dom[n]){for(const e of Array.from(this.dom.querySelectorAll("[data-ln-toast-item]")))m(e);p(this.dom),delete this.dom[n]}};function a(e,o){const l=((e.type||"")+"").trim().toLowerCase(),h=D(o,i,"ln-toast");if(!h)return console.warn('[ln-toast] Template "'+i+'" not found'),null;C(h,{type:l,title:e.title,message:typeof e.message=="string"?e.message:void 0});const d=h.firstElementChild;if(!d)return null;d.hasAttribute("data-ln-toast-item")||d.setAttribute("data-ln-toast-item",""),d.classList.add("ln-enter");const g=d.querySelector(".body");g&&s(g,e);const x=d.querySelector("[data-ln-toast-close]");return x&&x.addEventListener("click",function(){m(d)}),d}function s(e,o){if(Array.isArray(o.message)){const l=document.createElement("ul");for(const h of o.message){const d=document.createElement("li");d.textContent=h,l.appendChild(d)}e.appendChild(l)}if(o.data&&o.data.errors){const l=document.createElement("ul");for(const h of Object.values(o.data.errors).flat()){const d=document.createElement("li");d.textContent=h,l.appendChild(d)}e.appendChild(l)}}function u(e,o){const l=Array.from(e.dom.querySelectorAll("[data-ln-toast-item]"));for(;l.length>=e.max&&l.length>0;)e.dom.removeChild(l.shift());e.dom.appendChild(o),f(e.dom),requestAnimationFrame(()=>o.classList.remove("ln-enter"))}function m(e){if(!e||!e.parentNode)return;const o=e.parentNode;clearTimeout(e._timer),e.classList.remove("ln-enter"),e.classList.add("ln-out"),setTimeout(()=>{e.parentNode&&(e.parentNode.removeChild(e),p(o))},200)}function y(e){let o=e&&e.container;return typeof o=="string"&&(o=document.querySelector(o)),o instanceof HTMLElement||(o=document.querySelector("["+t+"]")||document.getElementById("ln-toast-container")),o||null}function w(e,o){if(e._lnToastHydrated)return;e._lnToastHydrated=!0;const l=e.querySelector("[data-ln-toast-close]");l&&l.addEventListener("click",function(){m(e)});const h=e.getAttribute("data-ln-toast-timeout"),d=h!==null?parseInt(h,10):NaN,g=Number.isFinite(d)?d:o.timeoutDefault;g>0&&(e._timer=setTimeout(function(){m(e)},g))}function P(e){const o=e.detail||{},l=y(o);if(!l){console.warn("[ln-toast] No toast container found");return}const h=l[n]||new r(l),d=a(o,l);if(!d)return;const g=Number.isFinite(o.timeout)?o.timeout:h.timeoutDefault;u(h,d),g>0&&(d._timer=setTimeout(()=>m(d),g))}function W(e){const o=e&&e.detail||{};if(o.container){const l=y(o);if(l)for(const h of Array.from(l.querySelectorAll("[data-ln-toast-item]")))m(h)}else{const l=document.querySelectorAll("["+t+"]");for(const h of Array.from(l))for(const d of Array.from(h.querySelectorAll("[data-ln-toast-item]")))m(d)}}v(function(){window.addEventListener("ln-toast:enqueue",P),window.addEventListener("ln-toast:clear",W),window.addEventListener("ln-modal:open",function(){const o=document.querySelectorAll("["+t+"]");for(const l of Array.from(o))l.querySelectorAll("[data-ln-toast-item]").length>0&&f(l)}),new MutationObserver(function(o){for(const l of o){if(l.type==="attributes"){c(l.target);continue}for(const h of l.addedNodes)c(h)}}).observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[t]}),c(document.body)},"ln-toast")})()})();
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(function(){"use strict";if(typeof window<"u"){const t=console.warn;console.warn=function(...e){typeof e[0]=="string"&&(e[0].startsWith("[ln-")||e[0].startsWith("[lnCore"))&&!(document.documentElement.hasAttribute("data-ln-debug")||document.body&&document.body.hasAttribute("data-ln-debug"))||t.apply(console,e)}}const b={};function K(t,e){b[t]||(b[t]=document.querySelector('[data-ln-template="'+t+'"]'));const o=b[t];return o?o.content.cloneNode(!0):(console.warn("["+(e||"ln-core")+'] Template "'+t+'" not found'),null)}function y(t,e,o){t.dispatchEvent(new CustomEvent(e,{bubbles:!0,detail:o||{}}))}function _(t,e,o){const l=new CustomEvent(e,{bubbles:!0,cancelable:!0,detail:o||{}});return t.dispatchEvent(l),l}function S(t,e){if(!t||!e)return t;const o=t.querySelectorAll("[data-ln-field]");for(let i=0;i<o.length;i++){const s=o[i],r=s.getAttribute("data-ln-field");e[r]!=null&&(s.textContent=e[r])}const l=t.querySelectorAll("[data-ln-attr]");for(let i=0;i<l.length;i++){const s=l[i],r=s.getAttribute("data-ln-attr").split(",");for(let c=0;c<r.length;c++){const a=r[c].trim().split(":");if(a.length!==2)continue;const d=a[0].trim(),f=a[1].trim();e[f]!=null&&s.setAttribute(d,e[f])}}const u=t.querySelectorAll("[data-ln-show]");for(let i=0;i<u.length;i++){const s=u[i],r=s.getAttribute("data-ln-show");r in e&&s.classList.toggle("hidden",!e[r])}const n=t.querySelectorAll("[data-ln-class]");for(let i=0;i<n.length;i++){const s=n[i],r=s.getAttribute("data-ln-class").split(",");for(let c=0;c<r.length;c++){const a=r[c].trim().split(":");if(a.length!==2)continue;const d=a[0].trim(),f=a[1].trim();f in e&&s.classList.toggle(d,!!e[f])}}return t}function j(t,e){t.matches&&t.matches("[data-ln-form], [data-ln-fillable]")&&t.dispatchEvent(new CustomEvent("ln-fill",{detail:e??null,bubbles:!0}));const o=t.querySelectorAll("[data-ln-form], [data-ln-fillable]");for(let l=0;l<o.length;l++)o[l].dispatchEvent(new CustomEvent("ln-fill",{detail:e??null,bubbles:!0}));return t}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._fillBound||(window.lnCore._fillBound=!0,document.addEventListener("ln-fill",function(t){if(!(!t.target.matches||!t.target.matches("[data-ln-fillable]")))if(t.detail)S(t.target,t.detail);else{const e=t.target.querySelectorAll("[data-ln-field]");for(let o=0;o<e.length;o++)e[o].textContent=""}})));function O(t,e){if(!t||!e)return t;const o=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);for(;o.nextNode();){const n=o.currentNode;n.textContent.indexOf("{{")!==-1&&(n.textContent=n.textContent.replace(/\{\{\s*(\w+)\s*\}\}/g,function(i,s){return e[s]!==void 0?e[s]:""}))}const l=function(n,i){return e[i]!==void 0?e[i]:""},u=Array.from(t.querySelectorAll("*"));t.nodeType===1&&u.push(t);for(let n=0;n<u.length;n++){const i=u[n],s=i.attributes;for(let r=0;r<s.length;r++){const c=s[r];c.value.indexOf("{{")!==-1&&i.setAttribute(c.name,c.value.replace(/\{\{\s*(\w+)\s*\}\}/g,l))}}return t}function B(t,e,o,l,u,n){const i={};for(let r=0;r<t.children.length;r++){const c=t.children[r],a=c.getAttribute("data-ln-key");a&&(i[a]=c)}const s=document.createDocumentFragment();for(let r=0;r<e.length;r++){const c=e[r],a=String(l(c));let d=i[a];if(d)u(d,c,r);else{const f=K(o,n);if(!f||(O(f,c),d=f.firstElementChild,!d))continue;d.setAttribute("data-ln-key",a),u(d,c,r)}s.appendChild(d)}t.textContent="",t.appendChild(s)}function q(t,e){if(!document.body){document.addEventListener("DOMContentLoaded",function(){q(t,e)}),console.warn("["+e+'] Script loaded before <body> — add "defer" to your <script> tag');return}t()}function w(t,e,o,l){if(t.nodeType!==1)return;const n=e.indexOf("[")!==-1||e.indexOf(".")!==-1||e.indexOf("#")!==-1?e:"["+e+"]",i=Array.from(t.querySelectorAll(n));t.matches&&t.matches(n)&&i.push(t);for(const s of i)s[o]||(s[o]=new l(s))}function F(t,e,o,l,u={}){const n=u.extraAttributes||[],i=u.onAttributeChange||null,s=u.onInit||null;function r(c){const a=c||document.body;w(a,t,e,o),s&&s(a)}return q(function(){const c=new MutationObserver(function(d){for(let f=0;f<d.length;f++){const g=d[f];if(g.type==="childList"){for(let h=0;h<g.addedNodes.length;h++){const p=g.addedNodes[h];p.nodeType===1&&(w(p,t,e,o),s&&s(p))}for(let h=0;h<g.removedNodes.length;h++){const p=g.removedNodes[h];if(p.nodeType===1){const N=t.indexOf("[")!==-1||t.indexOf(".")!==-1||t.indexOf("#")!==-1?t:"["+t+"]",A=Array.from(p.querySelectorAll(N));p.matches&&p.matches(N)&&A.push(p);for(let v=0;v<A.length;v++){const M=A[v];if(!document.contains(M)){const L=M[e];L&&typeof L.destroy=="function"&&L.destroy()}}}}}else g.type==="attributes"&&(i&&g.target[e]?i(g.target,g.attributeName):(w(g.target,t,e,o),s&&s(g.target)))}});let a=[];if(t.indexOf("[")!==-1){const d=/\[([\w-]+)/g;let f;for(;(f=d.exec(t))!==null;)a.push(f[1])}else a.push(t);c.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:a.concat(n)})},l),window[e]=r,document.readyState==="loading"?document.addEventListener("DOMContentLoaded",function(){r(document.body)}):r(document.body),r}const x={};function W(t,e){x[t]=e}function P(t){return x[t]||{ingress:e=>e,egress:e=>e}}const E={};function k(t,e){if(!t||typeof e!="object")return;const o=t.toLowerCase().split("-")[0];E[o]=e}function G(t){if(!t)return null;const e=t.toLowerCase().split("-")[0];return E[e]||null}k("mk",{monthsLong:["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"],monthsShort:["јан","фев","мар","апр","мај","јун","јул","авг","септ","окт","ноем","дек"],daysLong:["недела","понеделник","вторник","среда","четврток","петок","сабота"],daysShort:["нед","пон","вт","ср","чет","пет","саб"]}),typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerDataMapper=W,window.lnCore.getDataMapper=P,window.lnCore.registerLocaleFallback=k,window.lnCore.getLocaleFallback=G,window.lnCore.fillTemplate=O,window.lnCore.fill=S,window.lnCore.lnFill=j,window.lnCore.renderList=B);const U="ln:";let m=null;function T(){if(m!==null)return m;try{if(typeof localStorage>"u")return m=!1,!1;const t="__ln_test__";localStorage.setItem(t,t),localStorage.removeItem(t),m=!0}catch{m=!1}return m}function J(){return location.pathname.replace(/\/+$/,"").toLowerCase()||"/"}function R(t,e){const o=e.getAttribute("data-ln-persist"),l=o!==null&&o!==""?o:e.id;return l?U+t+":"+J()+":"+l:(console.warn('[ln-persist] Element requires id or data-ln-persist="key"',e),null)}function X(t,e){if(!T())return null;const o=R(t,e);if(!o)return null;try{const l=localStorage.getItem(o);return l!==null?JSON.parse(l):null}catch{return null}}function D(t,e,o){if(!T())return;const l=R(t,e);if(l)try{o==null?localStorage.removeItem(l):localStorage.setItem(l,JSON.stringify(o))}catch{}}function I(t){return(t||"").replace(/^#/,"")}function C(t){const e=t===void 0?location.hash:t,o={},l=I(e);if(!l)return o;const u=l.split("&");for(let n=0;n<u.length;n++){const i=u[n];if(!i)continue;const s=i.indexOf(":"),r=s>-1?i.slice(0,s):i,c=s>-1?i.slice(s+1):"";if(r)try{o[r]=decodeURIComponent(c)}catch{o[r]=c}}return o}function H(t){if(!t)return null;const e=C();return t in e?e[t]:null}function $(t,e){if(!t)return;const o=C();e==null?delete o[t]:o[t]=String(e);const u=Object.keys(o).map(function(n){const i=o[n];return i===""?n:n+":"+encodeURIComponent(i)}).join("&");I(location.hash)!==u&&(location.hash=u)}function z(t){return t.button===1||t.ctrlKey||t.metaKey||t.shiftKey?!1:(t.preventDefault(),!0)}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.hashParse=C,window.lnCore.hashGet=H,window.lnCore.hashSet=$,window.lnCore.hashLinkClick=z),(function(){const t="data-ln-toggle",e="lnToggle";if(window[e]!==void 0)return;function o(n,i){const s=document.querySelectorAll('[data-ln-toggle-for="'+n.id+'"]');for(const r of s)r.setAttribute("aria-expanded",i?"true":"false")}function l(n){this.dom=n;const i=this;if(this._onRequestOpen=function(){i.open()},this._onRequestClose=function(){i.close()},this._onRequestToggle=function(){i.toggle()},this.dom.addEventListener("ln-toggle:request-open",this._onRequestOpen),this.dom.addEventListener("ln-toggle:request-close",this._onRequestClose),this.dom.addEventListener("ln-toggle:request-toggle",this._onRequestToggle),n.hasAttribute("data-ln-persist")){const s=X("toggle",n);s!==null&&n.setAttribute(t,s)}return this.isOpen=n.getAttribute(t)==="open",this.isOpen&&n.classList.add("open"),o(n,this.isOpen),this}l.prototype.open=function(){this.dom.setAttribute(t,"open")},l.prototype.close=function(){this.dom.setAttribute(t,"close")},l.prototype.toggle=function(){const n=this.dom.getAttribute(t);this.dom.setAttribute(t,n==="open"?"close":"open")},l.prototype.destroy=function(){this.dom[e]&&(this.dom.removeEventListener("ln-toggle:request-open",this._onRequestOpen),this.dom.removeEventListener("ln-toggle:request-close",this._onRequestClose),this.dom.removeEventListener("ln-toggle:request-toggle",this._onRequestToggle),y(this.dom,"ln-toggle:destroyed",{target:this.dom}),delete this.dom[e])};function u(n){const i=n[e];if(!i)return;const r=n.getAttribute(t)==="open";if(r!==i.isOpen)if(r){if(_(n,"ln-toggle:before-open",{target:n}).defaultPrevented){n.setAttribute(t,"close");return}i.isOpen=!0,n.classList.add("open"),o(n,!0),y(n,"ln-toggle:open",{target:n}),n.hasAttribute("data-ln-persist")&&D("toggle",n,"open")}else{if(_(n,"ln-toggle:before-close",{target:n}).defaultPrevented){n.setAttribute(t,"open");return}i.isOpen=!1,n.classList.remove("open"),o(n,!1),y(n,"ln-toggle:close",{target:n}),n.hasAttribute("data-ln-persist")&&D("toggle",n,"close")}}document.addEventListener("click",function(n){if(n.ctrlKey||n.metaKey||n.button===1)return;const i=n.target.closest("[data-ln-toggle-for]");if(i){const s=i.getAttribute("data-ln-toggle-for"),r=document.getElementById(s);if(r&&r[e]){n.preventDefault();const c=i.getAttribute("data-ln-toggle-action")||"toggle";if(c==="open")r.setAttribute(t,"open");else if(c==="close")r.setAttribute(t,"close");else if(c==="toggle"){const a=r.getAttribute(t);r.setAttribute(t,a==="open"?"close":"open")}}}}),F(t,e,l,"ln-toggle",{onAttributeChange:u})})()})();
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(function(){"use strict";if(typeof window<"u"){const t=console.warn;console.warn=function(...e){typeof e[0]=="string"&&(e[0].startsWith("[ln-")||e[0].startsWith("[lnCore"))&&!(document.documentElement.hasAttribute("data-ln-debug")||document.body&&document.body.hasAttribute("data-ln-debug"))||t.apply(console,e)}}const E={};function B(t,e){E[t]||(E[t]=document.querySelector('[data-ln-template="'+t+'"]'));const r=E[t];return r?r.content.cloneNode(!0):(console.warn("["+(e||"ln-core")+'] Template "'+t+'" not found'),null)}function I(t,e,r){t.dispatchEvent(new CustomEvent(e,{bubbles:!0,detail:r||{}}))}function T(t,e){if(!t||!e)return t;const r=t.querySelectorAll("[data-ln-field]");for(let n=0;n<r.length;n++){const l=r[n],o=l.getAttribute("data-ln-field");e[o]!=null&&(l.textContent=e[o])}const c=t.querySelectorAll("[data-ln-attr]");for(let n=0;n<c.length;n++){const l=c[n],o=l.getAttribute("data-ln-attr").split(",");for(let s=0;s<o.length;s++){const d=o[s].trim().split(":");if(d.length!==2)continue;const a=d[0].trim(),m=d[1].trim();e[m]!=null&&l.setAttribute(a,e[m])}}const f=t.querySelectorAll("[data-ln-show]");for(let n=0;n<f.length;n++){const l=f[n],o=l.getAttribute("data-ln-show");o in e&&l.classList.toggle("hidden",!e[o])}const u=t.querySelectorAll("[data-ln-class]");for(let n=0;n<u.length;n++){const l=u[n],o=l.getAttribute("data-ln-class").split(",");for(let s=0;s<o.length;s++){const d=o[s].trim().split(":");if(d.length!==2)continue;const a=d[0].trim(),m=d[1].trim();m in e&&l.classList.toggle(a,!!e[m])}}return t}function P(t,e){t.matches&&t.matches("[data-ln-form], [data-ln-fillable]")&&t.dispatchEvent(new CustomEvent("ln-fill",{detail:e??null,bubbles:!0}));const r=t.querySelectorAll("[data-ln-form], [data-ln-fillable]");for(let c=0;c<r.length;c++)r[c].dispatchEvent(new CustomEvent("ln-fill",{detail:e??null,bubbles:!0}));return t}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._fillBound||(window.lnCore._fillBound=!0,document.addEventListener("ln-fill",function(t){if(!(!t.target.matches||!t.target.matches("[data-ln-fillable]")))if(t.detail)T(t.target,t.detail);else{const e=t.target.querySelectorAll("[data-ln-field]");for(let r=0;r<e.length;r++)e[r].textContent=""}})));function S(t,e){if(!t||!e)return t;const r=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);for(;r.nextNode();){const u=r.currentNode;u.textContent.indexOf("{{")!==-1&&(u.textContent=u.textContent.replace(/\{\{\s*(\w+)\s*\}\}/g,function(n,l){return e[l]!==void 0?e[l]:""}))}const c=function(u,n){return e[n]!==void 0?e[n]:""},f=Array.from(t.querySelectorAll("*"));t.nodeType===1&&f.push(t);for(let u=0;u<f.length;u++){const n=f[u],l=n.attributes;for(let o=0;o<l.length;o++){const s=l[o];s.value.indexOf("{{")!==-1&&n.setAttribute(s.name,s.value.replace(/\{\{\s*(\w+)\s*\}\}/g,c))}}return t}function F(t,e,r,c,f,u){const n={};for(let o=0;o<t.children.length;o++){const s=t.children[o],d=s.getAttribute("data-ln-key");d&&(n[d]=s)}const l=document.createDocumentFragment();for(let o=0;o<e.length;o++){const s=e[o],d=String(c(s));let a=n[d];if(a)f(a,s,o);else{const m=B(r,u);if(!m||(S(m,s),a=m.firstElementChild,!a))continue;a.setAttribute("data-ln-key",d),f(a,s,o)}l.appendChild(a)}t.textContent="",t.appendChild(l)}function k(t,e){if(!document.body){document.addEventListener("DOMContentLoaded",function(){k(t,e)}),console.warn("["+e+'] Script loaded before <body> — add "defer" to your <script> tag');return}t()}function L(t,e,r,c){if(t.nodeType!==1)return;const u=e.indexOf("[")!==-1||e.indexOf(".")!==-1||e.indexOf("#")!==-1?e:"["+e+"]",n=Array.from(t.querySelectorAll(u));t.matches&&t.matches(u)&&n.push(t);for(const l of n)l[r]||(l[r]=new c(l))}function M(t,e,r,c,f={}){const u=f.extraAttributes||[],n=f.onAttributeChange||null,l=f.onInit||null;function o(s){const d=s||document.body;L(d,t,e,r),l&&l(d)}return k(function(){const s=new MutationObserver(function(a){for(let m=0;m<a.length;m++){const b=a[m];if(b.type==="childList"){for(let y=0;y<b.addedNodes.length;y++){const g=b.addedNodes[y];g.nodeType===1&&(L(g,t,e,r),l&&l(g))}for(let y=0;y<b.removedNodes.length;y++){const g=b.removedNodes[y];if(g.nodeType===1){const C=t.indexOf("[")!==-1||t.indexOf(".")!==-1||t.indexOf("#")!==-1?t:"["+t+"]",i=Array.from(g.querySelectorAll(C));g.matches&&g.matches(C)&&i.push(g);for(let h=0;h<i.length;h++){const w=i[h];if(!document.contains(w)){const p=w[e];p&&typeof p.destroy=="function"&&p.destroy()}}}}}else b.type==="attributes"&&(n&&b.target[e]?n(b.target,b.attributeName):(L(b.target,t,e,r),l&&l(b.target)))}});let d=[];if(t.indexOf("[")!==-1){const a=/\[([\w-]+)/g;let m;for(;(m=a.exec(t))!==null;)d.push(m[1])}else d.push(t);s.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:d.concat(u)})},c),window[e]=o,document.readyState==="loading"?document.addEventListener("DOMContentLoaded",function(){o(document.body)}):o(document.body),o}const O={};function W(t,e){O[t]=e}function j(t){return O[t]||{ingress:e=>e,egress:e=>e}}const N={};function D(t,e){if(!t||typeof e!="object")return;const r=t.toLowerCase().split("-")[0];N[r]=e}function U(t){if(!t)return null;const e=t.toLowerCase().split("-")[0];return N[e]||null}D("mk",{monthsLong:["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"],monthsShort:["јан","фев","мар","апр","мај","јун","јул","авг","септ","окт","ноем","дек"],daysLong:["недела","понеделник","вторник","среда","четврток","петок","сабота"],daysShort:["нед","пон","вт","ср","чет","пет","саб"]}),typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerDataMapper=W,window.lnCore.getDataMapper=j,window.lnCore.registerLocaleFallback=D,window.lnCore.getLocaleFallback=U,window.lnCore.fillTemplate=S,window.lnCore.fill=T,window.lnCore.lnFill=P,window.lnCore.renderList=F);function q(t){return(t||"").replace(/^#/,"")}function _(t){const e=t===void 0?location.hash:t,r={},c=q(e);if(!c)return r;const f=c.split("&");for(let u=0;u<f.length;u++){const n=f[u];if(!n)continue;const l=n.indexOf(":"),o=l>-1?n.slice(0,l):n,s=l>-1?n.slice(l+1):"";if(o)try{r[o]=decodeURIComponent(s)}catch{r[o]=s}}return r}function G(t){if(!t)return null;const e=_();return t in e?e[t]:null}function K(t,e){if(!t)return;const r=_();e==null?delete r[t]:r[t]=String(e);const f=Object.keys(r).map(function(u){const n=r[u];return n===""?u:u+":"+encodeURIComponent(n)}).join("&");q(location.hash)!==f&&(location.hash=f)}function H(t){return t.button===1||t.ctrlKey||t.metaKey||t.shiftKey?!1:(t.preventDefault(),!0)}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.hashParse=_,window.lnCore.hashGet=G,window.lnCore.hashSet=K,window.lnCore.hashLinkClick=H);function X(t,e,r,c){const f=c,u=window.innerWidth,n=window.innerHeight,l=e.width,o=e.height,s=r.split("-"),d=s[0],a=s[1]==="start"||s[1]==="end"?s[1]:"center",m={top:["top","bottom","right","left"],bottom:["bottom","top","right","left"],left:["left","right","top","bottom"],right:["right","left","top","bottom"]},b=m[d]||m.bottom;function y(h){return h==="top"||h==="bottom"?a==="start"?t.left:a==="end"?t.right-l:t.left+(t.width-l)/2:a==="start"?t.top:a==="end"?t.bottom-o:t.top+(t.height-o)/2}function g(h){let w,p,A=!0;return h==="top"?(w=t.top-f-o,p=y(h),w<0&&(A=!1)):h==="bottom"?(w=t.bottom+f,p=y(h),w+o>n&&(A=!1)):h==="left"?(w=y(h),p=t.left-f-l,p<0&&(A=!1)):(w=y(h),p=t.right+f,p+l>u&&(A=!1)),{top:w,left:p,side:h,fits:A}}let v=null;for(let h=0;h<b.length;h++){const w=g(b[h]);if(w.fits){v=w;break}}v||(v=g(b[0]));let C=v.top,i=v.left;return l>=u?i=0:(i<0&&(i=0),i+l>u&&(i=u-l)),o>=n?C=0:(C<0&&(C=0),C+o>n&&(C=n-o)),{top:C,left:i,placement:v.side}}(function(){const t="data-ln-tooltip-enhance",e="data-ln-tooltip",r="data-ln-tooltip-position",c="lnTooltipEnhance",f="ln-tooltip-portal";if(window[c]!==void 0)return;let u=0,n=null,l=null,o=null,s=null,d=null,a=null;function m(){return n&&n.parentNode||(n=document.getElementById(f),n||(n=document.createElement("div"),n.id=f,document.body.appendChild(n)),n.hasAttribute("popover")||n.setAttribute("popover","manual")),n}function b(){a||(a=function(i){i.key==="Escape"&&v()},document.addEventListener("keydown",a))}function y(){a&&(document.removeEventListener("keydown",a),a=null)}function g(i){if(o===i)return;v();const h=i.getAttribute(e)||i.getAttribute("title");if(!h)return;m(),typeof n.showPopover=="function"&&n.showPopover(),i.hasAttribute("title")&&(s=i.getAttribute("title"),i.removeAttribute("title"));const w=i.getAttribute("aria-describedby");w?d=w:d=null;const p=document.createElement("div");p.className="ln-tooltip",p.textContent=h,i[c+"Uid"]||(u+=1,i[c+"Uid"]="ln-tooltip-"+u),p.id=i[c+"Uid"],n.appendChild(p);const A=p.offsetWidth,J=p.offsetHeight,Q=i.getBoundingClientRect(),V=i.getAttribute(r)||"top",x=X(Q,{width:A,height:J},V,6);p.style.top=x.top+"px",p.style.left=x.left+"px",p.setAttribute("data-ln-tooltip-placement",x.placement),d?i.setAttribute("aria-describedby",d+" "+p.id):i.setAttribute("aria-describedby",p.id),l=p,o=i,b()}function v(){if(!l){y();return}o&&(d!==null?o.setAttribute("aria-describedby",d):o.removeAttribute("aria-describedby"),d=null,s!==null&&o.setAttribute("title",s)),s=null,l.parentNode&&l.parentNode.removeChild(l),l=null,o=null,n&&typeof n.hidePopover=="function"&&n.matches(":popover-open")&&n.hidePopover(),y()}function C(i){return this.dom=i,i.hasAttribute("data-ln-tooltip-enhanced")||(i.setAttribute("data-ln-tooltip-enhanced",""),this._addedEnhancedAttr=!0),this._onEnter=function(){g(i)},this._onLeave=function(){o===i&&!i.contains(document.activeElement)&&v()},this._onFocus=function(){g(i)},this._onBlur=function(){o===i&&!i.matches(":hover")&&v()},i.addEventListener("mouseenter",this._onEnter),i.addEventListener("mouseleave",this._onLeave),i.addEventListener("focus",this._onFocus,!0),i.addEventListener("blur",this._onBlur,!0),this}C.prototype.destroy=function(){const i=this.dom;i.removeEventListener("mouseenter",this._onEnter),i.removeEventListener("mouseleave",this._onLeave),i.removeEventListener("focus",this._onFocus,!0),i.removeEventListener("blur",this._onBlur,!0),o===i&&v(),this._addedEnhancedAttr&&i.removeAttribute("data-ln-tooltip-enhanced"),delete i[c],delete i[c+"Uid"],I(i,"ln-tooltip:destroyed",{trigger:i})},M("["+t+"], [data-ln-tooltip-enhanced], ["+e+"][title]",c,C,"ln-tooltip")})()})();
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/* Suppress CSS baseline pseudo-element when JS enhance takes over —
|
|
2
|
-
either explicitly via data-ln-tooltip-enhance, or automatically when a
|
|
3
|
-
`title` attribute is present (JS auto-attaches to strip the native
|
|
4
|
-
browser tooltip, which CSS alone cannot do). */
|
|
5
|
-
[data-ln-tooltip][data-ln-tooltip-enhance]::after,
|
|
6
|
-
[data-ln-tooltip][data-ln-tooltip-enhanced]::after,
|
|
7
|
-
[data-ln-tooltip][title]::after {
|
|
8
|
-
content: none;
|
|
9
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(function(){"use strict";if(typeof window<"u"){const t=console.warn;console.warn=function(...e){typeof e[0]=="string"&&(e[0].startsWith("[ln-")||e[0].startsWith("[lnCore"))&&!(document.documentElement.hasAttribute("data-ln-debug")||document.body&&document.body.hasAttribute("data-ln-debug"))||t.apply(console,e)}}const b={};function m(t,e){b[t]||(b[t]=document.querySelector('[data-ln-template="'+t+'"]'));const i=b[t];return i?i.content.cloneNode(!0):(console.warn("["+(e||"ln-core")+'] Template "'+t+'" not found'),null)}function A(t,e,i){t.dispatchEvent(new CustomEvent(e,{bubbles:!0,detail:i||{}}))}function S(t,e,i){const c=new CustomEvent(e,{bubbles:!0,cancelable:!0,detail:i||{}});return t.dispatchEvent(c),c}function E(t,e){if(!t||!e)return t;const i=t.querySelectorAll("[data-ln-field]");for(let n=0;n<i.length;n++){const l=i[n],s=l.getAttribute("data-ln-field");e[s]!=null&&(l.textContent=e[s])}const c=t.querySelectorAll("[data-ln-attr]");for(let n=0;n<c.length;n++){const l=c[n],s=l.getAttribute("data-ln-attr").split(",");for(let r=0;r<s.length;r++){const d=s[r].trim().split(":");if(d.length!==2)continue;const u=d[0].trim(),f=d[1].trim();e[f]!=null&&l.setAttribute(u,e[f])}}const a=t.querySelectorAll("[data-ln-show]");for(let n=0;n<a.length;n++){const l=a[n],s=l.getAttribute("data-ln-show");s in e&&l.classList.toggle("hidden",!e[s])}const o=t.querySelectorAll("[data-ln-class]");for(let n=0;n<o.length;n++){const l=o[n],s=l.getAttribute("data-ln-class").split(",");for(let r=0;r<s.length;r++){const d=s[r].trim().split(":");if(d.length!==2)continue;const u=d[0].trim(),f=d[1].trim();f in e&&l.classList.toggle(u,!!e[f])}}return t}function R(t,e){t.matches&&t.matches("[data-ln-form], [data-ln-fillable]")&&t.dispatchEvent(new CustomEvent("ln-fill",{detail:e??null,bubbles:!0}));const i=t.querySelectorAll("[data-ln-form], [data-ln-fillable]");for(let c=0;c<i.length;c++)i[c].dispatchEvent(new CustomEvent("ln-fill",{detail:e??null,bubbles:!0}));return t}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._fillBound||(window.lnCore._fillBound=!0,document.addEventListener("ln-fill",function(t){if(!(!t.target.matches||!t.target.matches("[data-ln-fillable]")))if(t.detail)E(t.target,t.detail);else{const e=t.target.querySelectorAll("[data-ln-field]");for(let i=0;i<e.length;i++)e[i].textContent=""}})));function x(t,e){if(!t||!e)return t;const i=document.createTreeWalker(t,NodeFilter.SHOW_TEXT);for(;i.nextNode();){const o=i.currentNode;o.textContent.indexOf("{{")!==-1&&(o.textContent=o.textContent.replace(/\{\{\s*(\w+)\s*\}\}/g,function(n,l){return e[l]!==void 0?e[l]:""}))}const c=function(o,n){return e[n]!==void 0?e[n]:""},a=Array.from(t.querySelectorAll("*"));t.nodeType===1&&a.push(t);for(let o=0;o<a.length;o++){const n=a[o],l=n.attributes;for(let s=0;s<l.length;s++){const r=l[s];r.value.indexOf("{{")!==-1&&n.setAttribute(r.name,r.value.replace(/\{\{\s*(\w+)\s*\}\}/g,c))}}return t}function B(t,e,i,c,a,o){const n={};for(let s=0;s<t.children.length;s++){const r=t.children[s],d=r.getAttribute("data-ln-key");d&&(n[d]=r)}const l=document.createDocumentFragment();for(let s=0;s<e.length;s++){const r=e[s],d=String(c(r));let u=n[d];if(u)a(u,r,s);else{const f=m(i,o);if(!f||(x(f,r),u=f.firstElementChild,!u))continue;u.setAttribute("data-ln-key",d),a(u,r,s)}l.appendChild(u)}t.textContent="",t.appendChild(l)}function q(t,e){if(!document.body){document.addEventListener("DOMContentLoaded",function(){q(t,e)}),console.warn("["+e+'] Script loaded before <body> — add "defer" to your <script> tag');return}t()}function y(t,e,i,c){if(t.nodeType!==1)return;const o=e.indexOf("[")!==-1||e.indexOf(".")!==-1||e.indexOf("#")!==-1?e:"["+e+"]",n=Array.from(t.querySelectorAll(o));t.matches&&t.matches(o)&&n.push(t);for(const l of n)l[i]||(l[i]=new c(l))}function M(t,e,i,c,a={}){const o=a.extraAttributes||[],n=a.onAttributeChange||null,l=a.onInit||null;function s(r){const d=r||document.body;y(d,t,e,i),l&&l(d)}return q(function(){const r=new MutationObserver(function(u){for(let f=0;f<u.length;f++){const h=u[f];if(h.type==="childList"){for(let p=0;p<h.addedNodes.length;p++){const g=h.addedNodes[p];g.nodeType===1&&(y(g,t,e,i),l&&l(g))}for(let p=0;p<h.removedNodes.length;p++){const g=h.removedNodes[p];if(g.nodeType===1){const N=t.indexOf("[")!==-1||t.indexOf(".")!==-1||t.indexOf("#")!==-1?t:"["+t+"]",L=Array.from(g.querySelectorAll(N));g.matches&&g.matches(N)&&L.push(g);for(let v=0;v<L.length;v++){const T=L[v];if(!document.contains(T)){const C=T[e];C&&typeof C.destroy=="function"&&C.destroy()}}}}}else h.type==="attributes"&&(n&&h.target[e]?n(h.target,h.attributeName):(y(h.target,t,e,i),l&&l(h.target)))}});let d=[];if(t.indexOf("[")!==-1){const u=/\[([\w-]+)/g;let f;for(;(f=u.exec(t))!==null;)d.push(f[1])}else d.push(t);r.observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:d.concat(o)})},c),window[e]=s,document.readyState==="loading"?document.addEventListener("DOMContentLoaded",function(){s(document.body)}):s(document.body),s}const _={};function j(t,e){_[t]=e}function K(t){return _[t]||{ingress:e=>e,egress:e=>e}}const D={};function O(t,e){if(!t||typeof e!="object")return;const i=t.toLowerCase().split("-")[0];D[i]=e}function F(t){if(!t)return null;const e=t.toLowerCase().split("-")[0];return D[e]||null}O("mk",{monthsLong:["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"],monthsShort:["јан","фев","мар","апр","мај","јун","јул","авг","септ","окт","ноем","дек"],daysLong:["недела","понеделник","вторник","среда","четврток","петок","сабота"],daysShort:["нед","пон","вт","ср","чет","пет","саб"]}),typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerDataMapper=j,window.lnCore.getDataMapper=K,window.lnCore.registerLocaleFallback=O,window.lnCore.getLocaleFallback=F,window.lnCore.fillTemplate=x,window.lnCore.fill=E,window.lnCore.lnFill=R,window.lnCore.renderList=B);function k(t){return(t||"").replace(/^#/,"")}function w(t){const e=t===void 0?location.hash:t,i={},c=k(e);if(!c)return i;const a=c.split("&");for(let o=0;o<a.length;o++){const n=a[o];if(!n)continue;const l=n.indexOf(":"),s=l>-1?n.slice(0,l):n,r=l>-1?n.slice(l+1):"";if(s)try{i[s]=decodeURIComponent(r)}catch{i[s]=r}}return i}function W(t){if(!t)return null;const e=w();return t in e?e[t]:null}function I(t,e){if(!t)return;const i=w();e==null?delete i[t]:i[t]=String(e);const a=Object.keys(i).map(function(o){const n=i[o];return n===""?o:o+":"+encodeURIComponent(n)}).join("&");k(location.hash)!==a&&(location.hash=a)}function P(t){return t.button===1||t.ctrlKey||t.metaKey||t.shiftKey?!1:(t.preventDefault(),!0)}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.hashParse=w,window.lnCore.hashGet=W,window.lnCore.hashSet=I,window.lnCore.hashLinkClick=P),(function(){const t="data-ln-translations",e="lnTranslations";if(window[e]!==void 0)return;const i={en:"English",sq:"Shqip",sr:"Srpski"};function c(a){this.dom=a,this.activeLanguages=new Set,this.defaultLang=a.getAttribute(t+"-default")||"",this.placeholderLabel=a.getAttribute(t+"-placeholder")||"{lang} translation",this.removeLabel=a.getAttribute(t+"-remove-label")||"Remove {lang}",this.badgesEl=a.querySelector("["+t+"-active]"),this.menuEl=a.querySelector("[data-ln-dropdown] > [data-ln-toggle]");const o=a.getAttribute(t+"-locales");if(this.locales=i,o)try{this.locales=JSON.parse(o)}catch{console.warn("[ln-translations] Invalid JSON in data-ln-translations-locales")}this._applyDefaultLang(),this._updateDropdown();const n=this;return this._onRequestAdd=function(l){l.detail&&l.detail.lang&&n.addLanguage(l.detail.lang)},this._onRequestRemove=function(l){l.detail&&l.detail.lang&&n.removeLanguage(l.detail.lang)},a.addEventListener("ln-translations:request-add",this._onRequestAdd),a.addEventListener("ln-translations:request-remove",this._onRequestRemove),this._detectExisting(),this}c.prototype._applyDefaultLang=function(){if(!this.defaultLang)return;const a=this.dom.querySelectorAll("[data-ln-translatable]");for(const o of a){const n=o.querySelectorAll("input:not([data-ln-translatable-lang]), textarea:not([data-ln-translatable-lang]), select:not([data-ln-translatable-lang])");for(const l of n)l.setAttribute("data-ln-translatable-lang",this.defaultLang)}},c.prototype._detectExisting=function(){const a=this.dom.querySelectorAll("[data-ln-translatable-lang]");for(const o of a){const n=o.getAttribute("data-ln-translatable-lang");n&&n!==this.defaultLang&&this.activeLanguages.add(n)}this.activeLanguages.size>0&&(this._updateBadges(),this._updateDropdown())},c.prototype._updateDropdown=function(){if(!this.menuEl)return;this.menuEl.textContent="";const a=this;let o=0;for(const l in this.locales){if(!this.locales.hasOwnProperty(l)||this.activeLanguages.has(l))continue;o++;const s=m("ln-translations-menu-item","ln-translations");if(!s)return;const r=s.querySelector("[data-ln-translations-lang]");r.setAttribute("data-ln-translations-lang",l),r.textContent=this.locales[l],r.addEventListener("click",function(d){d.ctrlKey||d.metaKey||d.button===1||(d.preventDefault(),d.stopPropagation(),a.menuEl.getAttribute("data-ln-toggle")==="open"&&a.menuEl.setAttribute("data-ln-toggle","close"),a.addLanguage(l))}),this.menuEl.appendChild(s)}const n=this.dom.querySelector("["+t+"-add]");n&&(n.hidden=o===0)},c.prototype._updateBadges=function(){if(!this.badgesEl)return;this.badgesEl.textContent="";const a=this;this.activeLanguages.forEach(function(o){const n=m("ln-translations-badge","ln-translations");if(!n)return;const l=n.querySelector("[data-ln-translations-lang]");l.setAttribute("data-ln-translations-lang",o);const s=l.querySelector("span");s.textContent=a.locales[o]||o.toUpperCase();const r=l.querySelector("button"),d=a.locales[o]||o.toUpperCase();r.setAttribute("aria-label",a.removeLabel.replace("{lang}",d)),r.addEventListener("click",function(u){u.ctrlKey||u.metaKey||u.button===1||(u.preventDefault(),u.stopPropagation(),a.removeLanguage(o))}),a.badgesEl.appendChild(n)})},c.prototype.addLanguage=function(a,o){if(this.activeLanguages.has(a))return;const n=this.locales[a]||a;if(S(this.dom,"ln-translations:before-add",{target:this.dom,lang:a,langName:n}).defaultPrevented)return;this.activeLanguages.add(a),o=o||{};const s=this.dom.querySelectorAll("[data-ln-translatable]");for(const r of s){const d=r.getAttribute("data-ln-translatable"),u=r.getAttribute("data-ln-translations-prefix")||"",f=r.querySelector(this.defaultLang?'[data-ln-translatable-lang="'+this.defaultLang+'"]':"input:not([data-ln-translatable-lang]), textarea:not([data-ln-translatable-lang]), select:not([data-ln-translatable-lang])");if(!f)continue;const h=f.cloneNode(f.tagName==="SELECT");u?h.name=u+"[trans]["+a+"]["+d+"]":h.name="trans["+a+"]["+d+"]",h.value=o[d]!==void 0?o[d]:"",h.removeAttribute("id"),"placeholder"in h&&(h.placeholder=this.placeholderLabel.replace("{lang}",n)),h.setAttribute("data-ln-translatable-lang",a);const p=r.querySelectorAll('[data-ln-translatable-lang]:not([data-ln-translatable-lang="'+this.defaultLang+'"])'),g=p.length>0?p[p.length-1]:f;g.parentNode.insertBefore(h,g.nextSibling)}this._updateDropdown(),this._updateBadges(),A(this.dom,"ln-translations:added",{target:this.dom,lang:a,langName:n})},c.prototype.removeLanguage=function(a){if(!this.activeLanguages.has(a)||S(this.dom,"ln-translations:before-remove",{target:this.dom,lang:a}).defaultPrevented)return;const n=this.dom.querySelectorAll('[data-ln-translatable-lang="'+a+'"]');for(const l of n)l.parentNode.removeChild(l);this.activeLanguages.delete(a),this._updateDropdown(),this._updateBadges(),A(this.dom,"ln-translations:removed",{target:this.dom,lang:a})},c.prototype.getActiveLanguages=function(){return new Set(this.activeLanguages)},c.prototype.hasLanguage=function(a){return this.activeLanguages.has(a)},c.prototype.destroy=function(){if(!this.dom[e])return;const a=this.defaultLang,o=this.dom.querySelectorAll("[data-ln-translatable-lang]");for(const n of o)n.getAttribute("data-ln-translatable-lang")!==a&&n.parentNode.removeChild(n);this.dom.removeEventListener("ln-translations:request-add",this._onRequestAdd),this.dom.removeEventListener("ln-translations:request-remove",this._onRequestRemove),delete this.dom[e]},M(t,e,c,"ln-translations")})()})();
|
package/js/ln-upload/README.md
DELETED
|
@@ -1,255 +0,0 @@
|
|
|
1
|
-
# ln-upload
|
|
2
|
-
|
|
3
|
-
File upload component — drag-and-drop zone with XHR progress, client-side validation, and auto-rendered hidden inputs for form submit.
|
|
4
|
-
|
|
5
|
-
## Rationale & Mindset
|
|
6
|
-
|
|
7
|
-
Historically, the component used custom attributes like `data-ln-upload-context` to pass extra parameters (such as the context category `lecture`, `email_logo`, etc.) to the upload endpoint. This created a **tight coupling** between the generic frontend library component and specific project-level backend parameter names.
|
|
8
|
-
|
|
9
|
-
To make the component truly generic and declarative, it follows a **native-HTML form design mindset**:
|
|
10
|
-
* **Inputs as Parameters**: Any parameter or metadata that needs to be sent alongside the uploaded file is defined using standard HTML form inputs (e.g. `<input type="hidden">`, `<select>`, `<textarea>`) nested directly inside the `.ln-upload` container.
|
|
11
|
-
* **Dynamic Gathering**: When a file is dropped or selected, the component dynamically serializes all nested inputs and appends them to the `FormData` request.
|
|
12
|
-
* **Separation of Concerns**: The frontend library does not need to know about specific keys (like `context` or `entity_id`). It simply forwards whatever form inputs you declare.
|
|
13
|
-
|
|
14
|
-
### Benefits
|
|
15
|
-
1. **Zero Configuration for Backend Keys**: No need to rewrite the JS component if the backend changes a parameter name from `context` to `type` or requires extra fields.
|
|
16
|
-
2. **Dynamic Values**: If an input's value is modified by other scripts on the page prior to upload (e.g., dynamically setting an `entity_id` based on selection), the upload request will automatically receive the latest value at the moment of file dispatch.
|
|
17
|
-
3. **Decoupled Delete Routes**: The component derives the `DELETE` endpoint dynamically by replacing `/upload` in the upload URL with the file ID, or you can specify a custom delete pattern using `data-ln-upload-delete="/my-api/{id}"`.
|
|
18
|
-
|
|
19
|
-
## Attributes
|
|
20
|
-
|
|
21
|
-
| Attribute | On | Description |
|
|
22
|
-
|-----------|-----|-------------|
|
|
23
|
-
| `data-ln-upload="/files/upload"` | container | Upload URL (default: `/files/upload`) |
|
|
24
|
-
| `data-ln-upload-accept=".pdf,.doc,.docx"` | container | Allowed extensions (comma-separated) |
|
|
25
|
-
| `data-ln-upload-delete="/files/{id}"` | container | Optional custom delete URL pattern containing `{id}` (default: derived dynamically by replacing `/upload` with the file ID) |
|
|
26
|
-
| `data-ln-upload-context="documents"` | container | **[DEPRECATED]** Legacy context string sent as `context` fallback if no `<input name="context">` is nested. |
|
|
27
|
-
| `data-ln-upload-dict="key"` | hidden element | I18n dictionary for messages (see below) |
|
|
28
|
-
|
|
29
|
-
## Dictionary (i18n)
|
|
30
|
-
|
|
31
|
-
All keys are optional. If a key is missing, the component falls back to the English value shown below. Dict entries are read once at init via `buildDict()` and then removed from the DOM.
|
|
32
|
-
|
|
33
|
-
| Key | Used for | Fallback |
|
|
34
|
-
|-----|----------|----------|
|
|
35
|
-
| `remove` | Remove button aria-label and tooltip | `Remove` |
|
|
36
|
-
| `error` | Size slot text when upload fails | `Error` |
|
|
37
|
-
| `invalid-type` | Toast body — wrong extension | `This file type is not allowed` |
|
|
38
|
-
| `upload-failed` | Toast body — upload error | `Upload failed` |
|
|
39
|
-
| `delete-error` | Toast body — delete error | `Failed to delete file` |
|
|
40
|
-
| `network-error` | XHR network error + toast title for delete | `Network error` |
|
|
41
|
-
| `invalid-title` | Toast title — invalid file | `Invalid File` |
|
|
42
|
-
| `error-title` | Toast title — upload error | `Upload Error` |
|
|
43
|
-
| `delete-title` | Toast title — delete error | `Error` |
|
|
44
|
-
| `connection-error` | Toast body — delete fetch network failure | `Could not connect to server` |
|
|
45
|
-
|
|
46
|
-
Example (full override):
|
|
47
|
-
|
|
48
|
-
```html
|
|
49
|
-
<ul hidden>
|
|
50
|
-
<li data-ln-upload-dict="remove">Ukloni</li>
|
|
51
|
-
<li data-ln-upload-dict="error">Greška</li>
|
|
52
|
-
<li data-ln-upload-dict="invalid-type">Tip fajla nije dozvoljen</li>
|
|
53
|
-
<li data-ln-upload-dict="invalid-title">Neispravan fajl</li>
|
|
54
|
-
<!-- ... other keys as needed -->
|
|
55
|
-
</ul>
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
## Customization — item template
|
|
59
|
-
|
|
60
|
-
The component clones a `<template data-ln-template="ln-upload-item">` for every file row. Lookup order:
|
|
61
|
-
|
|
62
|
-
1. **Scoped** — a `<template>` inside the `[data-ln-upload]` container (per-instance override)
|
|
63
|
-
2. **Global** — a `<template>` anywhere at document root
|
|
64
|
-
3. **Auto-injected default** — the component inserts a default template into `<body>` on first init if none is present, so zero-config usage keeps working
|
|
65
|
-
|
|
66
|
-
### Required slots
|
|
67
|
-
|
|
68
|
-
Your template MUST include these elements for the component to function:
|
|
69
|
-
|
|
70
|
-
| Element | Attribute | Purpose |
|
|
71
|
-
|---------|-----------|---------|
|
|
72
|
-
| `<li>` root | `data-ln-class="ln-upload__item--uploading:uploading, ln-upload__item--error:error, ln-upload__item--deleting:deleting"` | State classes toggled via `fill()` |
|
|
73
|
-
| File name target | `data-ln-field="name"` | File name text |
|
|
74
|
-
| Size/status target | `data-ln-field="sizeText"` | `"0%"` → `"45%"` → `"12.3 KB"` → `"Error"` |
|
|
75
|
-
| File icon `<use>` | `data-ln-attr="href:iconHref"` | Auto-swapped to `#ln-icon-file` / `#ln-icon-custom-file-pdf` / `#ln-icon-custom-file-doc` / `#ln-icon-custom-file-epub` based on extension |
|
|
76
|
-
| Remove button | `data-ln-upload-action="remove"` and `data-ln-attr="aria-label:removeLabel, title:removeLabel"` | Click target (attribute-based, not class-based) |
|
|
77
|
-
| Progress bar | `class="ln-upload__progress-bar"` | Width is animated imperatively via inline style |
|
|
78
|
-
|
|
79
|
-
### Example — override with a two-line article layout
|
|
80
|
-
|
|
81
|
-
```html
|
|
82
|
-
<div data-ln-upload="/files/upload">
|
|
83
|
-
<template data-ln-template="ln-upload-item">
|
|
84
|
-
<li class="ln-upload__item" data-ln-class="ln-upload__item--uploading:uploading, ln-upload__item--error:error, ln-upload__item--deleting:deleting">
|
|
85
|
-
<svg class="ln-icon ln-icon--lg" aria-hidden="true"><use data-ln-attr="href:iconHref" href="#ln-icon-file"></use></svg>
|
|
86
|
-
<article>
|
|
87
|
-
<span class="ln-upload__name" data-ln-field="name"></span>
|
|
88
|
-
<span class="ln-upload__size" data-ln-field="sizeText"></span>
|
|
89
|
-
</article>
|
|
90
|
-
<button type="button" class="ln-upload__remove" data-ln-upload-action="remove" data-ln-attr="aria-label:removeLabel, title:removeLabel">
|
|
91
|
-
<svg class="ln-icon" aria-hidden="true"><use href="#ln-icon-x"></use></svg>
|
|
92
|
-
</button>
|
|
93
|
-
<div class="ln-upload__progress"><div class="ln-upload__progress-bar"></div></div>
|
|
94
|
-
</li>
|
|
95
|
-
</template>
|
|
96
|
-
<div class="ln-upload__zone"><p>Drop files</p></div>
|
|
97
|
-
<ul class="ln-upload__list"></ul>
|
|
98
|
-
</div>
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
## API
|
|
102
|
-
|
|
103
|
-
```javascript
|
|
104
|
-
// Instance API (on container element)
|
|
105
|
-
const uploader = document.getElementById('my-upload');
|
|
106
|
-
|
|
107
|
-
uploader.lnUploadAPI.getFileIds(); // [1, 2, 3] — server IDs
|
|
108
|
-
uploader.lnUploadAPI.getFiles(); // [{serverId, name, size}, ...]
|
|
109
|
-
uploader.lnUploadAPI.clear(); // Deletes everything (from server too)
|
|
110
|
-
uploader.lnUploadAPI.destroy(); // Cleanup — remove listeners and clear state
|
|
111
|
-
|
|
112
|
-
// Global API — only for non-standard cases (Shadow DOM, iframe)
|
|
113
|
-
// For AJAX/dynamic DOM or setAttribute: MutationObserver auto-initializes
|
|
114
|
-
window.lnUpload.init(containerElement); // Manual initialization
|
|
115
|
-
window.lnUpload.initAll(); // Initialize all
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
## Events
|
|
119
|
-
|
|
120
|
-
| Event | Bubbles | Detail |
|
|
121
|
-
|-------|---------|--------|
|
|
122
|
-
| `ln-upload:uploaded` | yes | `{ localId, serverId, name }` |
|
|
123
|
-
| `ln-upload:error` | yes | `{ file, message }` |
|
|
124
|
-
| `ln-upload:invalid` | yes | `{ file, message }` |
|
|
125
|
-
| `ln-upload:removed` | yes | `{ localId, serverId }` |
|
|
126
|
-
| `ln-upload:cleared` | yes | `{}` |
|
|
127
|
-
|
|
128
|
-
## Server API
|
|
129
|
-
|
|
130
|
-
### Upload (POST)
|
|
131
|
-
|
|
132
|
-
Request: `multipart/form-data` with `file` and `context` fields.
|
|
133
|
-
Headers: `X-CSRF-TOKEN`, `Accept: application/json`
|
|
134
|
-
|
|
135
|
-
Expected response:
|
|
136
|
-
```json
|
|
137
|
-
{ "id": 123, "name": "document.pdf", "size": 45678 }
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
### Delete (DELETE `/files/{id}`)
|
|
141
|
-
|
|
142
|
-
Headers: `X-CSRF-TOKEN`, `Accept: application/json`
|
|
143
|
-
Expected status: `200`
|
|
144
|
-
|
|
145
|
-
## HTML Structure
|
|
146
|
-
|
|
147
|
-
### Recommended (New Declarative Approach)
|
|
148
|
-
|
|
149
|
-
Place nested hidden inputs (or any form fields) representing your upload metadata inside the container:
|
|
150
|
-
|
|
151
|
-
```html
|
|
152
|
-
<div class="ln-upload" data-ln-upload="/files/upload" data-ln-upload-accept=".pdf,.doc,.docx">
|
|
153
|
-
<!-- Extra parameters sent dynamically to the POST endpoint -->
|
|
154
|
-
<input type="hidden" name="context" value="documents">
|
|
155
|
-
<input type="hidden" name="entity_id" value="123">
|
|
156
|
-
|
|
157
|
-
<div class="ln-upload__zone">
|
|
158
|
-
<p>Drag files here or click to browse</p>
|
|
159
|
-
</div>
|
|
160
|
-
<ul class="ln-upload__list"></ul>
|
|
161
|
-
|
|
162
|
-
<!-- Dictionary (optional) — see "Dictionary (i18n)" section above -->
|
|
163
|
-
</div>
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
### Legacy (Attribute-Based Approach)
|
|
167
|
-
|
|
168
|
-
```html
|
|
169
|
-
<div class="ln-upload" data-ln-upload="/files/upload" data-ln-upload-accept=".pdf,.doc,.docx" data-ln-upload-context="documents">
|
|
170
|
-
<div class="ln-upload__zone">
|
|
171
|
-
<p>Drag files here or click to browse</p>
|
|
172
|
-
</div>
|
|
173
|
-
<ul class="ln-upload__list"></ul>
|
|
174
|
-
</div>
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
## File Icons
|
|
178
|
-
|
|
179
|
-
The component automatically adds an SVG icon per file type using the icon loader:
|
|
180
|
-
- `#ln-icon-custom-file-pdf` — PDF (custom CDN)
|
|
181
|
-
- `#ln-icon-custom-file-doc` — DOC/DOCX (custom CDN)
|
|
182
|
-
- `#ln-icon-custom-file-epub` — EPUB (custom CDN)
|
|
183
|
-
- `#ln-icon-file` — all other types (Tabler CDN)
|
|
184
|
-
|
|
185
|
-
Custom icons require `window.LN_ICON_CUSTOM_CDN` to be set. See `js/ln-icon/README.md`.
|
|
186
|
-
|
|
187
|
-
## Hidden Inputs
|
|
188
|
-
|
|
189
|
-
After each successful upload, the component automatically creates `<input type="hidden" name="file_ids[]" value="serverId">` for each file. On form submit, the server receives the IDs directly.
|
|
190
|
-
|
|
191
|
-
## Integration & Source Files
|
|
192
|
-
|
|
193
|
-
### Loading the Component
|
|
194
|
-
|
|
195
|
-
The `ln-upload` component can be integrated into your project using one of the following methods:
|
|
196
|
-
|
|
197
|
-
#### 1. In-Bundle (Standard Integration)
|
|
198
|
-
Include the main unified `ln-ashlar` bundle to load all component observers together, which is standard for full application environments:
|
|
199
|
-
```html
|
|
200
|
-
<script src="dist/ln-ashlar.iife.js" defer></script>
|
|
201
|
-
```
|
|
202
|
-
|
|
203
|
-
#### 2. Standalone (Zero-Dependency IIFE)
|
|
204
|
-
If you only need file upload capability without the rest of the bundle, load the standalone, self-registering IIFE version of the component directly:
|
|
205
|
-
```html
|
|
206
|
-
<script src="js/ln-upload/ln-upload.js" defer></script>
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
### Source Files
|
|
210
|
-
|
|
211
|
-
For reference, active development, or customization, the component's codebase is structured into two main files:
|
|
212
|
-
|
|
213
|
-
* **Active Development Source (ESM)**: The primary development file where all component features, drag-and-drop mechanics, validation, and XHR progress logic are implemented is [js/ln-upload/src/ln-upload.js](file:///c:/laragon/www/ln-ashlar/js/ln-upload/src/ln-upload.js).
|
|
214
|
-
* **Compiled Standalone (IIFE)**: The built zero-dependency distribution version compiled for browser execution is [js/ln-upload/ln-upload.js](file:///c:/laragon/www/ln-ashlar/js/ln-upload/ln-upload.js).
|
|
215
|
-
|
|
216
|
-
---
|
|
217
|
-
|
|
218
|
-
## 🔧 Internals
|
|
219
|
-
|
|
220
|
-
Source: `js/ln-upload/ln-upload.js`. Each container has a closure-scoped `uploadedFiles` Map (`localId → { serverId, name, size }`) — not reactive; DOM is mutated directly as XHR events fire. `fileIdCounter` generates unique `localId` values (`'file-1'`, `'file-2'`, ...).
|
|
221
|
-
|
|
222
|
-
### Init
|
|
223
|
-
|
|
224
|
-
`_initUpload(container)`, guarded by `container.lnUploadAPI` against double-init. `_ensureDefaultItemTemplate()` runs once per init and injects the default `<template>` into `<body>` if no `[data-ln-template="ln-upload-item"]` exists anywhere in the document (see template lookup order above). A hidden `<input type="file" multiple>` is created if none exists inside the container.
|
|
225
|
-
|
|
226
|
-
### `addFile(file)` flow
|
|
227
|
-
|
|
228
|
-
1. Validate extension against `data-ln-upload-accept`. Invalid → dispatch `ln-upload:invalid`, enqueue error toast, return.
|
|
229
|
-
2. `cloneTemplateScoped` resolves the template (scoped → global → auto-injected default).
|
|
230
|
-
3. `fill(li, {...})` populates name, `sizeText: '0%'`, icon `href`, `removeLabel`, and the `uploading`/`error`/`deleting` state classes in one pass — the `ln-icon` observer independently picks up the `<use href>` swap and fetches the sprite.
|
|
231
|
-
4. `data-file-id` set (structural, not a `fill` slot); remove button disabled until upload completes.
|
|
232
|
-
5. `<li>` appended to `.ln-upload__list`, XHR POST opened with `FormData` (nested container inputs serialized in).
|
|
233
|
-
6. Progress: `progressBar.style.width` set imperatively + `fill(li, { sizeText: percent + '%' })`.
|
|
234
|
-
7. 2xx: `fill` to final state, remove button re-enabled, entry stored in `uploadedFiles`, hidden inputs rebuilt, `ln-upload:uploaded` dispatched.
|
|
235
|
-
8. Non-2xx / XHR error: progress forced to 100%, `fill(li, { sizeText: dict.error, error: true })`, `ln-upload:error` dispatched, error toast enqueued.
|
|
236
|
-
|
|
237
|
-
### Remove / delete flow
|
|
238
|
-
|
|
239
|
-
Remove-button clicks are delegated on `.ln-upload__list`, resolved via `closest('[data-ln-upload-action="remove"]')` (works through nested `svg`/`use`). `removeFile(localId)`: if the file has no `serverId` yet (still uploading), it's removed from DOM + Map directly. If a `serverId` exists, `fill(item, { deleting: true })` then `DELETE /files/{serverId}` — success removes from DOM + Map and dispatches `ln-upload:removed`; failure (non-200 or network catch) reverts `deleting: false` and enqueues an error toast.
|
|
240
|
-
|
|
241
|
-
### Hidden inputs
|
|
242
|
-
|
|
243
|
-
`updateHiddenInput()` fully rebuilds `<input type="hidden" name="file_ids[]">` from the current `uploadedFiles` Map after every upload and delete — form submit always reflects the current (not deleted) file set.
|
|
244
|
-
|
|
245
|
-
### Auto-toast
|
|
246
|
-
|
|
247
|
-
Errors dispatch `ln-toast:enqueue` on `window`. This is a soft integration — `ln-upload` does not import `ln-toast`; the toast only renders if that component is present.
|
|
248
|
-
|
|
249
|
-
### `destroy()`
|
|
250
|
-
|
|
251
|
-
Part of `container.lnUploadAPI`. Removes all listeners (zone, input, list), clears `uploadedFiles`, empties the `<ul>`, removes the init guard, deletes `lnUploadAPI`.
|
|
252
|
-
|
|
253
|
-
### MutationObserver
|
|
254
|
-
|
|
255
|
-
Global observer on `document.body` detects `[data-ln-upload]` elements added to the DOM and calls `_initUpload()` on them.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(function(){"use strict";if(typeof window<"u"){const e=console.warn;console.warn=function(...t){typeof t[0]=="string"&&(t[0].startsWith("[ln-")||t[0].startsWith("[lnCore"))&&!(document.documentElement.hasAttribute("data-ln-debug")||document.body&&document.body.hasAttribute("data-ln-debug"))||e.apply(console,t)}}const M={};function B(e,t){M[e]||(M[e]=document.querySelector('[data-ln-template="'+e+'"]'));const l=M[e];return l?l.content.cloneNode(!0):(console.warn("["+(t||"ln-core")+'] Template "'+e+'" not found'),null)}function E(e,t,l){e.dispatchEvent(new CustomEvent(t,{bubbles:!0,detail:l||{}}))}function A(e,t){if(!e||!t)return e;const l=e.querySelectorAll("[data-ln-field]");for(let r=0;r<l.length;r++){const s=l[r],i=s.getAttribute("data-ln-field");t[i]!=null&&(s.textContent=t[i])}const d=e.querySelectorAll("[data-ln-attr]");for(let r=0;r<d.length;r++){const s=d[r],i=s.getAttribute("data-ln-attr").split(",");for(let f=0;f<i.length;f++){const w=i[f].trim().split(":");if(w.length!==2)continue;const h=w[0].trim(),y=w[1].trim();t[y]!=null&&s.setAttribute(h,t[y])}}const p=e.querySelectorAll("[data-ln-show]");for(let r=0;r<p.length;r++){const s=p[r],i=s.getAttribute("data-ln-show");i in t&&s.classList.toggle("hidden",!t[i])}const m=e.querySelectorAll("[data-ln-class]");for(let r=0;r<m.length;r++){const s=m[r],i=s.getAttribute("data-ln-class").split(",");for(let f=0;f<i.length;f++){const w=i[f].trim().split(":");if(w.length!==2)continue;const h=w[0].trim(),y=w[1].trim();y in t&&s.classList.toggle(h,!!t[y])}}return e}function le(e,t){e.matches&&e.matches("[data-ln-form], [data-ln-fillable]")&&e.dispatchEvent(new CustomEvent("ln-fill",{detail:t??null,bubbles:!0}));const l=e.querySelectorAll("[data-ln-form], [data-ln-fillable]");for(let d=0;d<l.length;d++)l[d].dispatchEvent(new CustomEvent("ln-fill",{detail:t??null,bubbles:!0}));return e}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore._fillBound||(window.lnCore._fillBound=!0,document.addEventListener("ln-fill",function(e){if(!(!e.target.matches||!e.target.matches("[data-ln-fillable]")))if(e.detail)A(e.target,e.detail);else{const t=e.target.querySelectorAll("[data-ln-field]");for(let l=0;l<t.length;l++)t[l].textContent=""}})));function P(e,t){if(!e||!t)return e;const l=document.createTreeWalker(e,NodeFilter.SHOW_TEXT);for(;l.nextNode();){const m=l.currentNode;m.textContent.indexOf("{{")!==-1&&(m.textContent=m.textContent.replace(/\{\{\s*(\w+)\s*\}\}/g,function(r,s){return t[s]!==void 0?t[s]:""}))}const d=function(m,r){return t[r]!==void 0?t[r]:""},p=Array.from(e.querySelectorAll("*"));e.nodeType===1&&p.push(e);for(let m=0;m<p.length;m++){const r=p[m],s=r.attributes;for(let i=0;i<s.length;i++){const f=s[i];f.value.indexOf("{{")!==-1&&r.setAttribute(f.name,f.value.replace(/\{\{\s*(\w+)\s*\}\}/g,d))}}return e}function re(e,t,l,d,p,m){const r={};for(let i=0;i<e.children.length;i++){const f=e.children[i],w=f.getAttribute("data-ln-key");w&&(r[w]=f)}const s=document.createDocumentFragment();for(let i=0;i<t.length;i++){const f=t[i],w=String(d(f));let h=r[w];if(h)p(h,f,i);else{const y=B(l,m);if(!y||(P(y,f),h=y.firstElementChild,!h))continue;h.setAttribute("data-ln-key",w),p(h,f,i)}s.appendChild(h)}e.textContent="",e.appendChild(s)}function H(e,t){if(!document.body){document.addEventListener("DOMContentLoaded",function(){H(e,t)}),console.warn("["+t+'] Script loaded before <body> — add "defer" to your <script> tag');return}e()}function ie(e,t,l){if(e){const d=e.querySelector('[data-ln-template="'+t+'"]');if(d)return d.content.cloneNode(!0)}return B(t,l)}function ae(e,t){const l={},d=e.querySelectorAll("["+t+"]");for(let p=0;p<d.length;p++)l[d[p].getAttribute(t)]=d[p].textContent,d[p].remove();return l}const j={};function se(e,t){j[e]=t}function de(e){return j[e]||{ingress:t=>t,egress:t=>t}}const K={};function W(e,t){if(!e||typeof t!="object")return;const l=e.toLowerCase().split("-")[0];K[l]=t}function ce(e){if(!e)return null;const t=e.toLowerCase().split("-")[0];return K[t]||null}W("mk",{monthsLong:["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"],monthsShort:["јан","фев","мар","апр","мај","јун","јул","авг","септ","окт","ноем","дек"],daysLong:["недела","понеделник","вторник","среда","четврток","петок","сабота"],daysShort:["нед","пон","вт","ср","чет","пет","саб"]}),typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.registerDataMapper=se,window.lnCore.getDataMapper=de,window.lnCore.registerLocaleFallback=W,window.lnCore.getLocaleFallback=ce,window.lnCore.fillTemplate=P,window.lnCore.fill=A,window.lnCore.lnFill=le,window.lnCore.renderList=re);function X(e){return(e||"").replace(/^#/,"")}function O(e){const t=e===void 0?location.hash:e,l={},d=X(t);if(!d)return l;const p=d.split("&");for(let m=0;m<p.length;m++){const r=p[m];if(!r)continue;const s=r.indexOf(":"),i=s>-1?r.slice(0,s):r,f=s>-1?r.slice(s+1):"";if(i)try{l[i]=decodeURIComponent(f)}catch{l[i]=f}}return l}function ue(e){if(!e)return null;const t=O();return e in t?t[e]:null}function fe(e,t){if(!e)return;const l=O();t==null?delete l[e]:l[e]=String(t);const p=Object.keys(l).map(function(m){const r=l[m];return r===""?m:m+":"+encodeURIComponent(r)}).join("&");X(location.hash)!==p&&(location.hash=p)}function pe(e){return e.button===1||e.ctrlKey||e.metaKey||e.shiftKey?!1:(e.preventDefault(),!0)}typeof window<"u"&&(window.lnCore=window.lnCore||{},window.lnCore.hashParse=O,window.lnCore.hashGet=ue,window.lnCore.hashSet=fe,window.lnCore.hashLinkClick=pe),(function(){const e="data-ln-upload",t="lnUpload",l="data-ln-upload-dict",d="data-ln-upload-accept",p="data-ln-upload-context",m='<template data-ln-template="ln-upload-item"><li class="ln-upload__item" data-ln-class="ln-upload__item--uploading:uploading, ln-upload__item--error:error, ln-upload__item--deleting:deleting"><svg class="ln-icon" aria-hidden="true"><use data-ln-attr="href:iconHref" href="#ln-icon-file"></use></svg><span class="ln-upload__name" data-ln-field="name"></span><span class="ln-upload__size" data-ln-field="sizeText"></span><button type="button" class="ln-upload__remove" data-ln-upload-action="remove" data-ln-attr="aria-label:removeLabel, title:removeLabel"><svg class="ln-icon" aria-hidden="true"><use href="#ln-icon-x"></use></svg></button><div class="ln-upload__progress"><div class="ln-upload__progress-bar"></div></div></li></template>';function r(){if(document.querySelector('[data-ln-template="ln-upload-item"]')||!document.body)return;const o=document.createElement("div");o.innerHTML=m;const c=o.firstElementChild;c&&document.body.appendChild(c)}if(window[t]!==void 0)return;function s(o){if(o===0)return"0 B";const c=1024,u=["B","KB","MB","GB"],v=Math.floor(Math.log(o)/Math.log(c));return parseFloat((o/Math.pow(c,v)).toFixed(1))+" "+u[v]}function i(o){return o.split(".").pop().toLowerCase()}function f(o){return o==="docx"&&(o="doc"),["pdf","doc","epub"].includes(o)?"ln-icon-custom-file-"+o:"ln-icon-file"}function w(o,c){if(!c)return!0;const u="."+i(o.name);return c.split(",").map(function(S){return S.trim().toLowerCase()}).includes(u.toLowerCase())}function h(o){if(o.lnUploadAPI)return;r();const c=ae(o,l),u=o.querySelector(".ln-upload__zone"),v=o.querySelector(".ln-upload__list"),S=o.getAttribute(d)||"";if(!u||!v){console.warn("[ln-upload] Missing .ln-upload__zone or .ln-upload__list in container:",o);return}let _=o.querySelector('input[type="file"]');_||(_=document.createElement("input"),_.type="file",_.multiple=!0,_.classList.add("hidden"),S&&(_.accept=S.split(",").map(function(n){return n=n.trim(),n.startsWith(".")?n:"."+n}).join(",")),o.appendChild(_));const x=o.getAttribute(e)||"/files/upload",G=o.getAttribute(p)||"",J=o.getAttribute("data-ln-upload-delete")||(x.includes("/upload")?x.replace(/\/upload\/?$/,"/{id}"):x+"/{id}"),L=new Map;let ge=0;function z(){const n=document.querySelector('meta[name="csrf-token"]');return n?n.getAttribute("content"):""}function he(n){if(!w(n,S)){const a=c["invalid-type"];E(o,"ln-upload:invalid",{file:n,message:a}),E(window,"ln-toast:enqueue",{type:"error",title:c["invalid-title"]||"Invalid File",message:a||c["invalid-type"]||"This file type is not allowed"});return}const g="file-"+ ++ge,b=i(n.name),N=f(b),D=ie(o,"ln-upload-item","ln-upload");if(!D)return;const T=D.firstElementChild;if(!T)return;T.setAttribute("data-file-id",g),A(T,{name:n.name,sizeText:"0%",iconHref:"#"+N,removeLabel:c.remove||"Remove",uploading:!0,error:!1,deleting:!1});const U=T.querySelector(".ln-upload__progress-bar"),k=T.querySelector('[data-ln-upload-action="remove"]');k&&(k.disabled=!0),v.appendChild(T);const F=new FormData;F.append("file",n);const oe=new Set;o.querySelectorAll("input, select, textarea").forEach(function(a){if(a.name&&a.name!=="file_ids[]"&&a.type!=="file"){if((a.type==="checkbox"||a.type==="radio")&&!a.checked)return;F.append(a.name,a.value),oe.add(a.name)}}),!oe.has("context")&&G&&F.append("context",G);const C=new XMLHttpRequest;C.upload.addEventListener("progress",function(a){if(a.lengthComputable){const I=Math.round(a.loaded/a.total*100);U.style.width=I+"%",A(T,{sizeText:I+"%"})}}),C.addEventListener("load",function(){if(C.status>=200&&C.status<300){let a;try{a=JSON.parse(C.responseText)}catch{R("Invalid response");return}A(T,{sizeText:s(a.size||n.size),uploading:!1}),k&&(k.disabled=!1),L.set(g,{serverId:a.id,name:a.name,size:a.size}),q(),E(o,"ln-upload:uploaded",{localId:g,serverId:a.id,name:a.name})}else{let a=c["upload-failed"]||"Upload failed";try{a=JSON.parse(C.responseText).message||a}catch{}R(a)}}),C.addEventListener("error",function(){R(c["network-error"]||"Network error")});function R(a){U&&(U.style.width="100%"),A(T,{sizeText:c.error||"Error",uploading:!1,error:!0}),k&&(k.disabled=!1),E(o,"ln-upload:error",{file:n,message:a}),E(window,"ln-toast:enqueue",{type:"error",title:c["error-title"]||"Upload Error",message:a||c["upload-failed"]||"Failed to upload file"})}C.open("POST",x),C.setRequestHeader("X-CSRF-TOKEN",z()),C.setRequestHeader("Accept","application/json"),C.send(F)}function q(){for(const n of o.querySelectorAll('input[name="file_ids[]"]'))n.remove();for(const[,n]of L){const g=document.createElement("input");g.type="hidden",g.name="file_ids[]",g.value=n.serverId,o.appendChild(g)}}function ve(n){const g=L.get(n),b=v.querySelector('[data-file-id="'+n+'"]');if(!g||!g.serverId){b&&b.remove(),L.delete(n),q();return}b&&A(b,{deleting:!0});const N=J.replace("{id}",g.serverId);fetch(N,{method:"DELETE",headers:{"X-CSRF-TOKEN":z(),Accept:"application/json"}}).then(function(D){D.status===200?(b&&b.remove(),L.delete(n),q(),E(o,"ln-upload:removed",{localId:n,serverId:g.serverId})):(b&&A(b,{deleting:!1}),E(window,"ln-toast:enqueue",{type:"error",title:c["delete-title"]||"Error",message:c["delete-error"]||"Failed to delete file"}))}).catch(function(D){console.warn("[ln-upload] Delete error:",D),b&&A(b,{deleting:!1}),E(window,"ln-toast:enqueue",{type:"error",title:c["network-error"]||"Network error",message:c["connection-error"]||"Could not connect to server"})})}function V(n){for(const g of n)he(g);_.value=""}const Z=function(){_.click()},$=function(){V(this.files)},Q=function(n){n.preventDefault(),n.stopPropagation(),u.classList.add("ln-upload__zone--dragover")},Y=function(n){n.preventDefault(),n.stopPropagation(),u.classList.add("ln-upload__zone--dragover")},ee=function(n){n.preventDefault(),n.stopPropagation(),u.classList.remove("ln-upload__zone--dragover")},te=function(n){n.preventDefault(),n.stopPropagation(),u.classList.remove("ln-upload__zone--dragover"),V(n.dataTransfer.files)},ne=function(n){const g=n.target.closest('[data-ln-upload-action="remove"]');if(!g||!v.contains(g)||g.disabled)return;const b=g.closest(".ln-upload__item");b&&ve(b.getAttribute("data-file-id"))};u.addEventListener("click",Z),_.addEventListener("change",$),u.addEventListener("dragenter",Q),u.addEventListener("dragover",Y),u.addEventListener("dragleave",ee),u.addEventListener("drop",te),v.addEventListener("click",ne),o.lnUploadAPI={getFileIds:function(){return Array.from(L.values()).map(function(n){return n.serverId})},getFiles:function(){return Array.from(L.values())},clear:function(){for(const[,n]of L)if(n.serverId){const g=J.replace("{id}",n.serverId);fetch(g,{method:"DELETE",headers:{"X-CSRF-TOKEN":z(),Accept:"application/json"}})}L.clear(),v.innerHTML="",q(),E(o,"ln-upload:cleared",{})},destroy:function(){u.removeEventListener("click",Z),_.removeEventListener("change",$),u.removeEventListener("dragenter",Q),u.removeEventListener("dragover",Y),u.removeEventListener("dragleave",ee),u.removeEventListener("drop",te),v.removeEventListener("click",ne),L.clear(),v.innerHTML="",q(),delete o.lnUploadAPI}}}function y(){for(const o of document.querySelectorAll("["+e+"]"))h(o)}function me(){H(function(){new MutationObserver(function(c){for(const u of c)if(u.type==="childList"){for(const v of u.addedNodes)if(v.nodeType===1){v.hasAttribute(e)&&h(v);for(const S of v.querySelectorAll("["+e+"]"))h(S)}}else u.type==="attributes"&&u.target.hasAttribute(e)&&h(u.target)}).observe(document.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[e]})},"ln-upload")}window[t]={init:h,initAll:y},me(),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",y):y()})()})();
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
// ── JS state: upload display toggles ──
|
|
2
|
-
// Dictionary items hidden by JS
|
|
3
|
-
.ln-upload [data-ln-upload-dict] {
|
|
4
|
-
display: none;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
// Progress bar visibility controlled by JS uploading state
|
|
8
|
-
.ln-upload__item--uploading .ln-upload__progress {
|
|
9
|
-
display: block;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
.ln-upload__item:not(.ln-upload__item--uploading) .ln-upload__progress {
|
|
13
|
-
display: none;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
// Deleting state — JS disables interaction
|
|
17
|
-
.ln-upload__item--deleting {
|
|
18
|
-
opacity: 0.7;
|
|
19
|
-
pointer-events: none;
|
|
20
|
-
}
|